【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)
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中直接使用
@Override
protected void onDraw(Canvas canvas) {
Paint paintRed=new Paint();
paintRed.setColor(Color.Red);
canvas.drawPoint(11,3,paintRed); //在座標11,3上畫一個紅點
}
對於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方法中如何繪製路徑的演示程式碼為:
@Override
protected void onDraw(Canvas canvas) {
Paint paintPath=new Paint();
Paint paintText=new Paint();
paintPath.setColor(Color.Red); //路徑的畫刷為紅色
paintText.setColor(Color.Blue); //路徑上的文字為藍色
Path pathCWJ=new Path();
pathCWJ.addCircle(10,10,50,Direction.CW); // 半徑為50px,繪製的方向CW為順時針
canvas.drawPath(pathCWJ,paintPath);
canvas.drawTextOnPath("Android123 - CWJ",pathCWJ,0,15,paintText); //在路徑上繪製文字
}
有關路徑類常用的方法如下:
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類.
/**
* Paint類介紹
*
* Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要儲存了顏色,
* 樣式等繪製資訊,指定了如何繪製文字和圖形,畫筆物件有很多設定方法,
* 大體上可以分為兩類,一類與圖形繪製相關,一類與文字繪製相關。
*
* 1.圖形繪製
* setARGB(int a,int r,int g,int b);
* 設定繪製的顏色,a代表透明度,r,g,b代表顏色值。
*
* setAlpha(int a);
* 設定繪製圖形的透明度。
*
* setColor(int color);
* 設定繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。
*
* setAntiAlias(boolean aa);
* 設定是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。
*
* setDither(boolean dither);
* 設定是否使用影象抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,影象更加清晰
*
* setFilterBitmap(boolean filter);
* 如果該項設定為true,則影象在動畫進行中會濾掉對Bitmap影象的優化操作,加快顯示
* 速度,本設定項依賴於dither和xfermode的設定
*
* setMaskFilter(MaskFilter maskfilter);
* 設定MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 *
* setColorFilter(ColorFilter colorfilter);
* 設定顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果
*
* setPathEffect(PathEffect effect);
* 設定繪製路徑的效果,如點畫線等
*
* setShader(Shader shader);
* 設定影象效果,使用Shader可以繪製出各種漸變效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在圖形下面設定陰影層,產生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色
*
* setStyle(Paint.Style style);
* 設定畫筆的樣式,為FILL,FILL_OR_STROKE,或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 當畫筆樣式為STROKE或FILL_OR_STROKE時,設定筆刷的圖形樣式,如圓形樣式
* Cap.ROUND,或方形樣式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 設定繪製時各圖形的結合方式,如平滑效果等
*
* setStrokeWidth(float width);
* 當畫筆樣式為STROKE或FILL_OR_STROKE時,設定筆刷的粗細度
*
* setXfermode(Xfermode xfermode);
* 設定圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果
*
* 2.文字繪製
* setFakeBoldText(boolean fakeBoldText);
* 模擬實現粗體文字,設定在小字型上效果會非常差
*
* setSubpixelText(boolean subpixelText);
* 設定該項為true,將有助於文字在LCD螢幕上的顯示效果
*
* setTextAlign(Paint.Align align);
* 設定繪製文字的對齊方向
*
* setTextScaleX(float scaleX);
* 設定繪製文字x軸的縮放比例,可以實現文字的拉伸的效果
*
* setTextSize(float textSize);
* 設定繪製文字的字號大小
*
* setTextSkewX(float skewX);
* 設定斜體文字,skewX為傾斜弧度
*
* setTypeface(Typeface typeface);
* 設定Typeface物件,即字型風格,包括粗體,斜體以及襯線體,非襯線體等
*
* setUnderlineText(boolean underlineText);
* 設定帶有下劃線的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 設定帶有刪除線的效果
*
*/