自定義View中畫布相關類及畫布測量座標系。
阿新 • • 發佈:2019-02-11
canvas類介紹
Canvas這個類相當於一個畫布,你可以在裡面畫很多東西;
我們可以把這個Canvas理解成系統提供給我們的一塊記憶體區域(但實際上它只是一套畫圖的API,真正的記憶體是下面的Bitmap),而且它還提供了一整套對這個記憶體區域進行操作的方法,所有的這些操作都是畫圖API。也就是說在這種方式下我們已經能一筆一劃或者使用Graphic來畫我們所需要的東西了,要畫什麼要顯示什麼都由我們自己控制。
這種方式根據環境還分為兩種:一種就是使用普通View的canvas畫圖,還有一種就是使用專門的SurfaceView的canvas來畫圖。兩種的主要是區別就是可以在SurfaceView中定義一個專門的執行緒來完成畫圖工作,應用程式不需要等待View的刷圖,提高效能。前面一種適合處理量比較小,幀率比較小的動畫,比如說象棋遊戲之類的;而後一種主要用在遊戲,高品質動畫方面的畫圖。
canvas常用方法:
其下方法中Paint paint;表示畫筆類。。其後討論,
canvas.drawRect(float left, float top, float right, float bottom, Paint paint) //畫一個矩形區域!left ,top,right,bottom,分別表示矩形左上右下的距離螢幕距離值。 canvas.drawCircle(float cx, float cy, float radius, Paint paint) //畫一個圓!cx cy,radiu 表示園心的左上距離螢幕值和園半徑。 canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint) //畫一個線! 引數表示直接翻譯得知線的起始點座標XY,與終止點座標XY; 構成兩點一線; canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint) //利用矩形繪製一段弧形!對矩形內切圓,引數oval表示外切矩形的左上右下值 ,startAngel表示 弧形開始起點(內切圖的圓心右方表示0度 起點 90度正下方。180度左邊),sweepAngle 表示 劃過的度數,( 設定360則表示一個內切圓,180則是一半,) UseCenter表示是否將弧線兩端連線圓心做線(常用得到扇形處理true)。 canvas.drawPath(Path path, Paint paint) //畫一條軌跡!Path 表示 一個路徑類, Path類中的方法(比如lineTo,quadTo)可以通過指定軌跡進行路徑,然後通過canvas畫出來。 canvas.drawPoint(float x, float y, Paint paint) //畫單個點!drawPoints(float[] pts, Paint paint) //畫一堆點 ,
Paint類
想象成可變的一隻筆
在繪圖過程中起到了極其重要的作用,畫筆主要儲存了顏色,
* 樣式等繪製資訊,指定了如何繪製文字和圖形,畫筆物件有很多設定方法,
* 大體上可以分為兩類,一類與圖形繪製相關,一類與文字繪製相關。
setPathEffect() //設定路徑樣式<pre name="code" class="java">setAlpha(int a) // 設定alpha不透明度,範圍為0~255 setAntiAlias(boolean aa) // 是否抗鋸齒 setColor(int color) // 設定顏色,這裡Android內部定義的有Color類包含了一些常見顏色定義 setTextScaleX(float scaleX) // 設定文字縮放倍數,1.0f為原始 setTextSize(float textSize) // 設定字型大小 setStyle(Style style) //設定樣式 setUnderlineText(booleanunderlineText) // 設定下劃線
Path類
表示一個路徑軌跡
常用方法
reset()// 重新設定Path值,,但是不改變內部的樣式
moveTo(float x,float y) //設定軌跡起點
rMoveTo(float x,float y) //重新設定起點 如果沒有moveTo則 等同於moveTo
lineTo(float x,float y)// 一條線的軌跡 ,如果沒有moveto則 從(0,0)開始畫
quadTo(float x1, float y1,float x2,float y2) // 貝塞爾曲線,,其實別想得太複雜就是畫曲線一演算法,x1,x2表示控制點(何為控制點,自行百度),x2,y2表示終點 ,如果沒有moveTo 則從(0.0)開始
public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) //立方 曲線 前面x1,x2,y1,y2都是控制點.X3.Y3結束點
close()//是的軌跡成為封閉的圖形,,常用作多邊形 。
測量座標系
1。View獲得佈局位置後onlayout後 可在ondraw中得到。,getTop()返回得到 2。同上,getBottom()返回得到, 3。同上,getLeft()返回得到,
4。同上,getRigth()返回得到,
5。view自身測量完後得到的值onMeasure後都可以得到,getMeasuredHeight() 6。同上getMeasuredWidth()。 注意點 getwidth 與getHeight 並不能測量後就得到。底層通過rigth - left ,bottom-top得到。 一般情況下與measures的值一樣。當measure的值超過螢幕了,就不一樣。getwidth最大為螢幕大小。