天天看點

【Android】 Canvas、Path 和 Paint 執行個體 (遊戲開發必備)

Canvas類主要實作了螢幕的繪制過程,其中包含了很多實用的方法,比如繪制一條路徑、區域、貼圖、畫點、畫線、渲染文本,下面是Canvas類常用的方法,當然Android開發網提示大家很多方法有不同的重載版本,參數更靈活。

  void drawRect(RectF rect, Paint paint) //繪制區域,參數一為RectF一個區域

  void drawPath(Path path, Paint paint) //繪制一個路徑,參數一為Path路徑對象 

  void  drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)   //貼圖,參數一就是我們正常的Bitmap對象,參數二是源區域(Android123提示這裡是bitmap),參數三是目标區域(應該在canvas的位置和大小),參數四是Paint畫刷對象,因為用到了縮放和拉伸的可能,當原始Rect不等于目标Rect時性能将會有大幅損失。 

  void  drawLine(float startX, float startY, float stopX, float stopY, Paint paint)  //畫線,參數一起始點的x軸位置,參數二起始點的y軸位置,參數三終點的x軸水準位置,參數四y軸垂直位置,最後一個參數為Paint畫刷對象。

  void  drawPoint(float x, float y, Paint paint) //畫點,參數一水準x軸,參數二垂直y軸,第三個參數為Paint對象。

         void drawText(String text, float x, float y, Paint paint)  //渲染文本,Canvas類除了上面的還可以描繪文字,參數一是String類型的文本,參數二x軸,參數三y軸,參數四是Paint對象。

  void  drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路徑上繪制文本,相對于上面第二個參數是Path路徑對象

  從上面來看我們可以看出Canvas繪制類比較簡單同時很靈活,實作一般的方法通常沒有問題,同時可以疊加的處理設計出一些效果,不過細心的網友可能發現最後一個參數均為Paint對象。如果我們把Canvas當做繪畫師來看,那麼Paint就是我們繪畫的工具,比如畫筆、畫刷、顔料等等

Paint類常用方法:

 void  setARGB(int a, int r, int g, int b)  設定Paint對象顔色,參數一為alpha透明通道

       void  setAlpha(int a)  設定alpha不透明度,範圍為0~255

 void  setAntiAlias(boolean aa)  //是否抗鋸齒

 void  setColor(int color)  //設定顔色,這裡Android内部定義的有Color類包含了一些常見顔色定義 

 void  setFakeBoldText(boolean fakeBoldText)  //設定僞粗體文本

       void  setLinearText(boolean linearText)  //設定線性文本

       PathEffect  setPathEffect(PathEffect effect)  //設定路徑效果

       Rasterizer  setRasterizer(Rasterizer rasterizer) //設定光栅化

       Shader  setShader(Shader shader)  //設定陰影 

 void  setTextAlign(Paint.Align align)  //設定文本對齊

       void  setTextScaleX(float scaleX)  //設定文本縮放倍數,1.0f為原始

       void  setTextSize(float textSize)  //設定字型大小

       Typeface  setTypeface(Typeface typeface)  //設定字型,Typeface包含了字型的類型,粗細,還有傾斜、顔色等。

 void  setUnderlineText(boolean underlineText)  //設定下劃線

 最終Canvas和Paint在onDraw中直接使用

view plain print ?

  1. <span style="font-size:16px;"> @Override  
  2.     protected void onDraw(Canvas canvas) {  
  3.     Paint paintRed=new Paint();  
  4.     paintRed.setColor(Color.Red);  
  5.     canvas.drawPoint(11,3,paintRed); //在坐标11,3上畫一個紅點  
  6. }</span>  

對于Android遊戲開發或者說2D繪圖中來講Path路徑可以用強大這個詞來形容。在Photoshop中我們可能還記得使用鋼筆工具繪制路徑的方法。Path路徑類在位于android.graphics.Path中,Path的構造方法比較簡單,如下

   Path cwj = new Path();  //構造方法

   下面我們畫一個封閉的原型路徑,我們使用Path類的addCircle方法

   cwj.addCircle(10,10,50,Direction.CW); //參數一為x軸水準位置,參數二為y軸垂直位置,第三個參數為圓形的半徑,最後是繪制的方向,CW為順時針方向,而CCW是逆時針方向。

    結合Android上次提到的Canvas類中的繪制方法drawPath和drawTextOnPath,我們繼續可以在onDraw中加入。

   canvas.drawPath(cwj,paintPath); //Android123提示大家這裡paintPath為路徑的畫刷顔色,可以見下文完整的源代碼。

   canvas.drawTextOnPath("Android123 - CWJ",cwj,0,15,paintText); //将文字繪制到路徑中去,有關drawTextOnPath的參數如下:

   方法原型public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint) 

     參數清單:

text  為需要在路徑上繪制的文字内容。 

path 将文字繪制到哪個路徑。 

hOffset   距離路徑開始的距離

            vOffset   離路徑的上下高度,這裡Android開發網提示大家,該參數類型為float浮點型,除了精度為8位小數外,可以為正或負,當為正時文字在路徑的圈裡面,為負時在路徑的圈外面。 

              paint  最後仍然是一個Paint對象用于制定Text本文的顔色、字型、大小等屬性。

  下面是我們的onDraw方法中如何繪制路徑的示範代碼為:

view plain print ?

  1. <span style="font-size:16px;">   @Override  
  2.    protected void onDraw(Canvas canvas) {  
  3.     Paint paintPath=new Paint();  
  4.     Paint paintText=new Paint();  
  5.     paintPath.setColor(Color.Red); //路徑的畫刷為紅色  
  6.     paintText.setColor(Color.Blue); //路徑上的文字為藍色  
  7.     Path pathCWJ=new Path();  
  8.     pathCWJ.addCircle(10,10,50,Direction.CW); // 半徑為50px,繪制的方向CW為順時針  
  9.     canvas.drawPath(pathCWJ,paintPath);  
  10.    canvas.drawTextOnPath("Android123 - CWJ",pathCWJ,0,15,paintText); //在路徑上繪制文字  
  11.   }</span>  

   有關路徑類常用的方法如下:

 void  addArc(RectF oval, float startAngle, float sweepAngle)  //為路徑添加一個多邊形

       void  addCircle(float x, float y, float radius, Path.Direction dir)  //給path添加圓圈

void  addOval(RectF oval, Path.Direction dir)  //添加橢圓形

void  addRect(RectF rect, Path.Direction dir)  //添加一個區域

void  addRoundRect(RectF rect, float[] radii, Path.Direction dir)  //添加一個圓角區域

boolean  isEmpty()  //判斷路徑是否為空

void  transform(Matrix matrix)  //應用矩陣變換

void  transform(Matrix matrix, Path dst)  //應用矩陣變換并将結果放到新的路徑中,即第二個參數。

  有關路徑的進階效果大家可以使用PathEffect類.

繼續閱讀