Android繪圖基礎

繪圖三要素

  • 一支畫筆 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.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); //必須設置,否則默認為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度,正數表示順時針旋轉。當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()則是把圖層合并起來。通常我們可以先調用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()支持通過路徑來剪貼一塊區域。通常我們可用此方法剪貼一個區域,然后調用該Drawabledraw(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各條邊距離畫布坐標軸的距離。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容