android之自定義View
其實自定義view就是再定義一個java檔案,這個檔案繼承view或viewgroud,然後通過定義大小,畫筆,畫布來自定義一個新view。然後在layout佈局檔案中使用。

方法
可以看到
其中常用的建構函式有兩種,(context,attributeset)(context)。其中attributest包含了自定義view大小的全部資訊。我們一般還要要在建構函式中初始化畫筆(paint)。畫筆的FILL是填充型別,STROKE是描邊,FILL_AND_STROKE是描邊和填充。

初始化畫筆
onMeasure():測量view的大小,有兩個引數。其中可以通過MeasureSpec.getSize.geMode來獲取控制元件的大小和模式(佔兩位二進位制),由於有兩個引數用的程式碼重複率很高,所以另外寫一個函式。 模式有三種模式:EXACTLY:父佈局,已經確定大小,AT_MOST子佈局,確定了最大值。UNSPECIFIED預設佈局。 最後把確定的大小通過setMeasureDimension(w,h)重置大小。
onSizeChanged:確定view的大小
onLayout:確定子view的位置(viewGroup)
onDraw:繪製內容:利用畫布和筆來繪製內容,畫布用引數自帶的canvas!!!
Canvas.drawPoint() .drawLine()都差不多一樣,線是起點和終點的座標

點和線的繪製
需要描矩形的三個:矩形,橢圓,圓弧分別對應drawRect(rect.paint),drawOval(rect.paint),drawArc(rect.start.end.center.paint)。其中Rect代表的是int型,RectF代表的是float型。矩形還可以繪製圓角矩形drawRoundRect(rect.x.y.paint)

繪製矩形的幾種方法
drawCircle(x.y.r.paint)繪製圓通過一箇中心和半徑來確定
drawText():根據左下角開始繪製。
canvas.translate(x.y)將畫布中心平移
canvas.scale(sx.sy) .scale(sx.sy.x.y) 其中0.5f代表縮放一半,-0.5f代表縮放一半後向時鐘旋轉180度。

scale案例
canvas.rotate(de) .rotate(de.x.y)

rotate
canvas.skew(fx.fy)其中fx.fy是tan旋轉角度的值

skew
畫布是由很多圖層構成的

save和restore
點陣圖是由畫素一個一個組合而成,向量圖是由數學方程組合而成。
drawPicture:向量圖
使用Picture要關閉硬體加速器:android:hardwareAccelerated="false"
Picture:錄製畫布的內容並存起來,再下次要用的時候直接呼叫。方法有錄製時的beginRecording(w.h),endRecording(),繪製draw(c),

Picture的用法
Picture的表示有三種方式:1.自己的draw(can)方法,2.canvas的drawPicture(pic) drawPicture(pic.rect)方法,3.將其包裝成PictureDrawable,使用起draw(can)方法。 其中自己的draw對canvas有影響和操作性弱。2和3不會對canvas有影響,,且操作性強。
// 包裝成為Drawable的方法 PictureDrawable drawable = new PictureDrawable(mPicture); // 設定繪製區域drawable.setBounds(0,0,250,mPicture.getHeight()); // 繪製drawable.draw(canvas);
drawBitmap:點陣圖
獲取Bitmap的三種方法:Bitmap.BitmapDrawable.BitmapFactory後兩種是從資原始檔 記憶體卡 網路等地方獲取一張圖片並轉換為內容不可變的Bitmap。推薦使用BitmapFactory。
BitmapFactory轉換成Bitmap的三種方法:BitmapFactory.decodeStream(st) decodeResource(Context.getResource.R) decodeFile(path)
drawBitmap的三種方法
第二種中是圖片距離座標原點的距離。第三種中src是繪製區域,dst是顯示區域。

drawBitmap三種方法