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(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) |
1.畫筆初始化
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);