Android自定義控件(二)View的繪制

android的圖形的繪制,主要用到Canvas。
google官網(wǎng)上已經(jīng)給出了Canvas的用法,https://developer.android.google.cn/guide/topics/graphics/2d-graphics.html

  • Canvas類具有畫圖的能力,如果你想畫圖,要具備四個部件。
    1.Bitmap控制像素
    2.Canvas控制繪圖請求
    3.一些繪圖的方法, Rect, Path, text, Bitmap等
    4.一個畫筆,可以自定義colors和styles
構(gòu)造方法 備注
Canvas() 空的構(gòu)造方法
Canvas(Bitmap bitmap) 帶bitmap的構(gòu)造方法
  • Canvas的常用操作
操作類型 相關(guān)API 備注
繪制顏色 drawColor, drawRGB, drawARGB 使用單一顏色填充整個畫布
繪制基本形狀 drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc 依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧
繪制圖片 drawBitmap, drawPicture 繪制位圖和圖片
繪制文本 drawText, drawPosText, drawTextOnPath 依次為 繪制文字、繪制文字時指定每個文字位置、根據(jù)路徑繪制文字
繪制路徑 drawPath 繪制路徑,繪制貝塞爾曲線時也需要用到該函數(shù)
頂點操作 drawVertices, drawBitmapMesh 通過對頂點操作可以使圖像形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪制的Bitmap作用
畫布剪裁 clipPath, clipRect 設(shè)置畫布的顯示區(qū)域
畫布快照 save, restore, saveLayerXxx, restoreToCount, getSaveCount 依次為 保存當(dāng)前狀態(tài)、 回滾到上一次保存的狀態(tài)、 保存圖層狀態(tài)、 回滾到指定狀態(tài)、 獲取保存次數(shù)
畫布變換 translate, scale, rotate, skew 依次為 位移、縮放、 旋轉(zhuǎn)、錯切
Matrix(矩陣) getMatrix, setMatrix, concat 實際畫布的位移,縮放等操作的都是圖像矩陣Matrix,只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。
  • Paint 代表了Canvas上的畫筆、畫刷、顏料等等;
    Paint類常用方法:
操作類型 相關(guān)API 備注
設(shè)置argb [setARGB](https://developer.android.google.cn/reference/android/graphics/Paint.html#setARGB(int, int, int, int))(int a, int r, int g, int b)
設(shè)置透明度 setAlpha(int a)
設(shè)置抗鋸齒 setAntiAlias(boolean aa)
設(shè)置顏色 setColor(int color)
設(shè)置畫筆寬度 setStrokeWidth(float width)
設(shè)置樣式 setStyle(Paint.Style style) Paint.Style.FILL填充內(nèi)部Paint.Style.FILL_AND_STROKE 填充內(nèi)部和描邊 Paint.Style.STROKE 描邊
設(shè)置文本縮放倍數(shù) setTextScaleX(float scaleX)
設(shè)置字體大小 setTextSize(float textSize)
設(shè)置下劃線 setUnderlineText(boolean underlineText)
重置畫筆 reset()
  • 畫筆初始化
 mPaint2 = new Paint();
  mPaint2.setColor(Color.RED);
  mPaint2.setStyle(Paint.Style.FILL);
  mPaint2.setAntiAlias(true);```
1.畫點

mPaint2.setStrokeWidth(10);
canvas.drawPoint(100, 100, mPaint2);
canvas.drawPoints(new float[]{100, 120, 120, 120, 140, 120},mPaint2);```
2.畫直線,繪制直線需要兩個點,初始點和結(jié)束點,同樣繪制直線也可以繪制一條或者繪制一組:

 canvas.drawLine(100,150,200,150,mPaint2);
canvas.drawLines(new float[]{100,170,220,170,100,190,300,190},mPaint2);```
3.繪制矩形,確定一個矩形最少需要四個數(shù)據(jù),就是對角線的兩個點的坐標(biāo)值

canvas.drawRect(100,210,300,300,mPaint2); //第一種,兩點確定一個矩形
Rect rect=new Rect(400,210,600,300); //將矩形封裝為rect ,Rect是int(整形)的
canvas.drawRect(rect,mPaint2);
RectF rectF=new RectF(700,210,900,300); //RectF是float(單精度浮點型)的
canvas.drawRect(rectF,mPaint2);```
4.繪制圓角矩形

 RectF rectF1=new RectF(100,350,500,400);
 canvas.drawRoundRect(rectF1,30,30,mPaint2);
 canvas.drawRoundRect(60,350,800,400,mPaint2);   //API>=21```

  5.繪制橢圓

RectF rectF2=new RectF(100,450,500,550);
canvas.drawOval(rectF2,mPaint2);
canvas.drawOval(600,500,800,600,mPaint2); //API>=21```
6.繪制圓,繪制圓形有四個參數(shù),前兩個是圓心坐標(biāo),第三個是半徑,最后一個是畫筆

canvas.drawCircle(700,700,100,mPaint2);```
7.繪制圓弧
- 第一種
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint){}
   
- 第二種
public void drawArc(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean useCenter, @NonNull Paint paint) {}

startAngle  - 開始角度
sweepAngle  - 掃過角度
useCenter   - 是否使用中心

RectF rectF3=new RectF(100,850,300,900);
canvas.drawRect(rectF3,mPaint1);
canvas.drawArc(rectF3,0,90,false,mPaint2);
RectF rectF4=new RectF(400,850,600,900);
canvas.drawRect(rectF4,mPaint1);
canvas.drawArc(rectF4,0,90,true,mPaint2);```

微信圖片_20170323095301.png

源碼下載地址:https://github.com/baojie0327/ViewAndGroup

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容