Android繪圖基礎(chǔ)

繪圖三要素

  • 一支畫筆 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.StyleFill的時候,是指該矩形各條邊到畫布坐標軸的距離(一般是畫布的左頂點水平方向為X軸,垂直方向為Y軸,Y軸向下為正)。當Paint.StyleStroke的時候,是指該矩形邊框各條邊的中心的到畫布坐標軸的距離。
  • 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)。當useCentertrue時,會顯示左右兩條邊,為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)用該Drawabledraw(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各條邊距離畫布坐標軸的距離。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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