繪圖三要素
- 一支畫筆 Paint。
- 一張畫布 Canvas。
- 一個 Bitmap 或者一個 View 來承載這個圖形。
Paint常用屬性
-
setAntiAlias()
設置畫筆鋸齒效果。 -
setColor()
設置畫筆顏色。 -
setTextSize()
設置字體尺寸。 -
setStrokeWidth()
設置空心邊框的寬度。 -
setStyle()
設置畫筆的風格。
Canvas常用draw方法
-
drawPoint()
畫點。 -
drawLine()
畫線。 -
drawRect()
畫矩形。 -
drawRoundRext()
畫圓角矩形。 -
drawArc()
畫弧形.扇形。 -
drawOval()
畫橢圓。 -
drawPath()
畫路徑。 -
drawText()
畫文本。
說明
- 對于
drawRect(left,tob,rigth,bottom,paint)
接收的四個參數,當Paint.Style
為Fill
的時候,是指該矩形各條邊到畫布坐標軸的距離(一般是畫布的左頂點水平方向為X軸,垂直方向為Y軸,Y軸向下為正)。當Paint.Style
為Stroke
的時候,是指該矩形邊框各條邊的中心的到畫布坐標軸的距離。 -
drawPath()
方法繪制的是路徑。比如我要繪制一個三角形,并顯示在ImageView上:
Bitmap bm = Bitmap.createBitmap(1000,1000, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bm);
paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE); //必須設置,否則默認為Fill,會填充。
paint.setStrokeWidth(3.0f);
Path path = new Path();
path.moveTo(100,100);
path.lineTo(500,300);
path.lineTo(300,600);
path.close(); // 閉合曲線。
canvas.drawPath(path,paint);
imageView.setImageBitmap(bm);
- 其中
moveTo()
,方法是把起始點移動到指定位置。lineTo()
是從起始點畫一條道指定點的直線。更多關于Path
的知識,請參考android繪圖之Path總結。 -
drawArc()
,drawArc(left,top,righ,bottom,startAngle,sweepAngle,useCenter,paint)
是先按照給定的上下左右的距離確定一個矩形(長寬不一定要相等),然后把這個矩形的上邊為旋轉到startAngel
角度,把矩形的左邊旋轉到和上邊所成的夾角為sweepAngle
角度,然后用弧線連接這兩條邊的端點。其中和X軸平行的方向為0度,正數表示順時針旋轉。當useCenter
為true
時,會顯示左右兩條邊,為false
時,只顯示一段弧線。如繪制了一個扇形:
canvas.drawArc(100,100,300,300,30,60,true,paint);
Canvas的其他方法
Canvas.sava()
Canvas.restore()
Canvas.translate()
Canvas.rotate()
Canvas.scale()
Canvas.saveLayer()
Canvas.saveLayerAlpha()
Canvas.restoreToCount()
Canvas.clipPath()
說明
-
Canvas.sava()
是把之前在畫布上的操作保存起來,使之后的操作在另外一個圖層上。Canvas.restore()
則是把圖層合并起來。通常我們可以先調用Canvas.sava()
啟用一個新的圖層,然后我們可以通過Canvas.translate()
或Canvas.rotate()
移動或旋轉這個新圖層,這時的坐標都是以這個新的圖層為基準,此時能大大簡化我們的坐標計算。完成繪制之后,再調用Canvas.restore()
就可以了。 -
Canvas.saveLayer()
。public int saveLayer(RectF bounds,Paint paint,int saveFlags)
,可以看到這個方法可以接受一個bounds
參數。和save()
方法不同的地方是,save()
方法不能改變新圖層的形狀,而saveLayer()
方法不僅可以創建一個或多個不同形狀的圖層,還可以指定合并圖層的樣式。saveLayerAlpha()
則是開啟一個帶透明度的圖層。 -
Canvas.clipPath()
支持通過路徑來剪貼一塊區域。通常我們可用此方法剪貼一個區域,然后調用該Drawable
的draw(canvas)
,來繪制一個圖形。如下代碼繪制了一個圓形的圖片。
Drawable drawable = getResources().getDrawable(R.drawable.image,null);
// 必須調用setBounds方法,因為系統要確定該Drawable的大小。
drawable.setBounds(0,0,1000,1000);
Path path = new Path();
path.addCircle(500,500,500,Path.Direction.CW);
canvas.clipPath(path);
drawable.draw(canvas);
imageView.setImageBitmap(bm);
注意
- 必須調用
setBounds()
。設置的bounds
想當于設定了該Drawable
各條邊距離畫布坐標軸的距離。