android的圖形的繪制,主要用到Canvas。
google官網上已經給出了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
構造方法 | 備注 |
---|---|
Canvas() | 空的構造方法 |
Canvas(Bitmap bitmap) | 帶bitmap的構造方法 |
- Canvas的常用操作
操作類型 | 相關API | 備注 |
---|---|---|
繪制顏色 | drawColor, drawRGB, drawARGB | 使用單一顏色填充整個畫布 |
繪制基本形狀 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧 |
繪制圖片 | drawBitmap, drawPicture | 繪制位圖和圖片 |
繪制文本 | drawText, drawPosText, drawTextOnPath | 依次為 繪制文字、繪制文字時指定每個文字位置、根據路徑繪制文字 |
繪制路徑 | drawPath | 繪制路徑,繪制貝塞爾曲線時也需要用到該函數 |
頂點操作 | drawVertices, drawBitmapMesh | 通過對頂點操作可以使圖像形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪制的Bitmap作用 |
畫布剪裁 | clipPath, clipRect | 設置畫布的顯示區域 |
畫布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次為 保存當前狀態、 回滾到上一次保存的狀態、 保存圖層狀態、 回滾到指定狀態、 獲取保存次數 |
畫布變換 | translate, scale, rotate, skew | 依次為 位移、縮放、 旋轉、錯切 |
Matrix(矩陣) | getMatrix, setMatrix, concat | 實際畫布的位移,縮放等操作的都是圖像矩陣Matrix,只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。 |
- Paint 代表了Canvas上的畫筆、畫刷、顏料等等;
Paint類常用方法:
操作類型 | 相關API | 備注 |
---|---|---|
設置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) | |
設置透明度 | setAlpha(int a) | |
設置抗鋸齒 | setAntiAlias(boolean aa) | |
設置顏色 | setColor(int color) | |
設置畫筆寬度 | setStrokeWidth(float width) | |
設置樣式 | setStyle(Paint.Style style) | Paint.Style.FILL填充內部Paint.Style.FILL_AND_STROKE 填充內部和描邊 Paint.Style.STROKE 描邊 |
設置文本縮放倍數 | setTextScaleX(float scaleX) | |
設置字體大小 | setTextSize(float textSize) | |
設置下劃線 | 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.畫直線,繪制直線需要兩個點,初始點和結束點,同樣繪制直線也可以繪制一條或者繪制一組:
canvas.drawLine(100,150,200,150,mPaint2);
canvas.drawLines(new float[]{100,170,220,170,100,190,300,190},mPaint2);```
3.繪制矩形,確定一個矩形最少需要四個數據,就是對角線的兩個點的坐標值
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.繪制圓,繪制圓形有四個參數,前兩個是圓心坐標,第三個是半徑,最后一個是畫筆
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);```
源碼下載地址:https://github.com/baojie0327/ViewAndGroup