1. 程式人生 > >自定義View中畫布相關類及畫布測量座標系。

自定義View中畫布相關類及畫布測量座標系。

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類 

想象成可變的一隻筆

在繪圖過程中起到了極其重要的作用,畫筆主要儲存了顏色,  

     * 樣式等繪製資訊,指定了如何繪製文字和圖形,畫筆物件有很多設定方法,  

     * 大體上可以分為兩類,一類與圖形繪製相關,一類與文字繪製相關。

<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)  // 設定下劃線
setPathEffect()  //設定路徑樣式

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最大為螢幕大小。