繪圖三要素
- 一支畫筆 Paint。
- 一張畫布 Canvas。
- 一個 Bitmap 或者一個 View 來承載這個圖形。
Paint常用屬性
-
setAntiAlias()設(shè)置畫筆鋸齒效果。 -
setColor()設(shè)置畫筆顏色。 -
setTextSize()設(shè)置字體尺寸。 -
setStrokeWidth()設(shè)置空心邊框的寬度。 -
setStyle()設(shè)置畫筆的風格。
Canvas常用draw方法
-
drawPoint()畫點。 -
drawLine()畫線。 -
drawRect()畫矩形。 -
drawRoundRext()畫圓角矩形。 -
drawArc()畫弧形.扇形。 -
drawOval()畫橢圓。 -
drawPath()畫路徑。 -
drawText()畫文本。
說明
- 對于
drawRect(left,tob,rigth,bottom,paint)接收的四個參數(shù),當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); //必須設(shè)置,否則默認為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()是從起始點畫一條道指定點的直線。更多關(guān)于Path的知識,請參考android繪圖之Path總結(jié)。 -
drawArc(),drawArc(left,top,righ,bottom,startAngle,sweepAngle,useCenter,paint)是先按照給定的上下左右的距離確定一個矩形(長寬不一定要相等),然后把這個矩形的上邊為旋轉(zhuǎn)到startAngel角度,把矩形的左邊旋轉(zhuǎn)到和上邊所成的夾角為sweepAngle角度,然后用弧線連接這兩條邊的端點。其中和X軸平行的方向為0度,正數(shù)表示順時針旋轉(zhuǎn)。當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()則是把圖層合并起來。通常我們可以先調(diào)用Canvas.sava()啟用一個新的圖層,然后我們可以通過Canvas.translate()或Canvas.rotate()移動或旋轉(zhuǎn)這個新圖層,這時的坐標都是以這個新的圖層為基準,此時能大大簡化我們的坐標計算。完成繪制之后,再調(diào)用Canvas.restore()就可以了。 -
Canvas.saveLayer()。public int saveLayer(RectF bounds,Paint paint,int saveFlags),可以看到這個方法可以接受一個bounds參數(shù)。和save()方法不同的地方是,save()方法不能改變新圖層的形狀,而saveLayer()方法不僅可以創(chuàng)建一個或多個不同形狀的圖層,還可以指定合并圖層的樣式。saveLayerAlpha()則是開啟一個帶透明度的圖層。 -
Canvas.clipPath()支持通過路徑來剪貼一塊區(qū)域。通常我們可用此方法剪貼一個區(qū)域,然后調(diào)用該Drawable的draw(canvas),來繪制一個圖形。如下代碼繪制了一個圓形的圖片。
Drawable drawable = getResources().getDrawable(R.drawable.image,null);
// 必須調(diào)用setBounds方法,因為系統(tǒng)要確定該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);
注意
- 必須調(diào)用
setBounds()。設(shè)置的bounds想當于設(shè)定了該Drawable各條邊距離畫布坐標軸的距離。