Android-2D绘图
概述
Android中使用圖形處理引擎,2D部分是android SDK內部自己提供,3D部分是用Open GL ES 1.0
大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他們提供了圖形處理相關的: Canvas、ColorFilter、Point(點)和RetcF(矩形)等,還有一些動畫相關的:AnimationDrawable、 BitmapDrawable和TransitionDrawable等。以圖形處理來說,我們最常用到的就是在一個View上畫一些圖片、形狀或者自定義的文本內容,這里我們都是使用Canvas來實現的。你可以獲取View中的Canvas對象,繪制一些自定義形狀,然后調用View. invalidate方法讓View重新刷新,然后繪制一個新的形狀,這樣達到2D動畫效果。
Canvas:畫布,用來直接在View上繪制諸如矩形,圓形,文字,位圖等圖形。
它提供了各種API:
填充:
public void drawARGB(int a, int r, int g, int b) public void drawColor(int color) public void drawRGB(int r, int g, int b) public void drawColor(int color, PorterDuff.Mode mode)因為Canvas內部維持了一個mutable Bitmap,所以,它可以使用這些顏色去填充整個Bitmap。并且在API中提到(restricted to the current clip)受限制于clip的范圍
繪制幾何圖像
canvas.drawArc (扇形)
canvas.drawCircle(圓)
canvas.drawOval(橢圓)
canvas.drawLine(線)
canvas.drawPoint(點)
canvas.drawRect(矩形)
canvas.drawRoundRect(圓角矩形)
canvas.drawVertices(頂點)
cnavas.drawPath(路徑)
同時受限于clip和matrix
繪制圖片
canvas.drawBitmap (位圖)canvas.drawPicture (圖片)同時受限于clip和matrix文本
canvas.drawText
上面列舉的是Canvas所能繪制的基本內容,在實際使用中,可以使用各種過濾或者過度模式,或者其他手段,來達到繪制各種效果。
過渡模式:
Xfermode,AvoidXfermode,PixelXorXfermode,PorterDuffXfermode
PorterDuff
過濾
1、rgb過濾 ColorFilter ,ColorMatrixFilter,PorterDuffColorFilter,LightingColorFilter,PorterDuffColorFilter
2、alpha過濾 MaskFilter,BlurMaskFilter,EmbossMaskFilter
3、DrawFilter,PaintFlagsDrawFilter
變換
Matrix,Camera,ColorMatrix
顏色
Color
漸變
Shader
BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient
Canvas的變換
如果只是那些簡單的draw…方法,那么canvas的功能就太單調了。Canvas還提供了一系列位置轉換的方法:rorate、scale、translate、skew(扭曲)等。
另外還常用的兩個方法是:
- save:用來保存Canvas的狀態。save之后,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。
- restore:用來恢復Canvas之前保存的狀態。防止save后對Canvas執行的操作對后續的繪制有影響。save和restore要配對使用(restore可以比save少,但不能多),如果restore調用次數比save多,會引發Error。
Paint:畫筆,作用于畫布上,用來設置我們繪制圖案的一些參數,如線條寬度(粗細),顏色等。常用的設置有:
setetAntiAlias: 設置畫筆的鋸齒效果。
setColor: 設置顏色
setARGB: 設置的ARGB色彩值。
setAlpha: 設置Alpha值
setTextSize: 設置字體尺寸。
setStyle: 設置畫筆風格,空心或者實心。
setStrokeWidth: 設置空心的邊框寬度。
setShader:設置陰影效果
setTextSkewX:設置文字傾斜度
Color:顏色類,主要是提供畫筆的顏色等。可以定義在res/values/colors.xml中,也可以直接用系統提供的顏色值,更可通知Color.parseColor()來設置顏色。常用的系統顏色值如:
Color.BLACK;
Color.WHITE;
Color.BLUE;
Color.RED;
Color.YELLOW……
Paint類:畫筆
Graphics軟件包中提供了Canvas(畫布)、Paint(畫筆)等常用的類,通過這些類中的方法,可以方便地繪制點、線、顏色以及各種幾何圖形等。
在Android中,繪圖操作一般是通過Paint畫筆在Canvas畫布上進行繪制的,最后將Canvas畫布呈現給用戶。繪圖之前需要首先設置Paint畫筆,Android系統中通過Paint類來實現。Paint類中提供了很多方法來設置畫筆屬性,例如顏色、字體、透明度等。
setColor
【功能說明】該方法用于設置畫筆的顏色,可以通過Color類中的預定義顏色來設置,也可以通過指定RGB值來設置。該方法是設置顏色的主要方法,通過改變畫筆顏色,可以繪制出色彩繽紛的圖形。
【基本語法】public void setColor (int color)
其中,參數color為顏色值,也可以直接使用系統Color類中定義的顏色,如下所示。
Color.BLACK:黑色。
Color.BLUE:藍色。
Color.CYAN:青綠色。
Color.DKGRAY:灰黑色。
Color.YELLOW:黃色。
Color.GRAY:灰色。
Color.GREEN:綠色。
Color.LTGRAY:淺灰色。
Color.MAGENTA:紅紫色。
Color.RED:紅色。
Color.TRANSPARENT:透明。
Color.WHITE:白色。
【實例演示】下面通過代碼來演示如何設置畫筆顏色。
自定義View
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View;/*** MyApp** @author Mr.Yang on 2016-04-12 21:59.* @version 1.0* 自定義View*/ public class MyGraphics extends View implements Runnable{// 聲明畫筆對象Paint paint ;/*** 構造函數* @param context*/public MyGraphics(Context context) {super(context);// 初始化Paintpaint = new Paint();// 開啟線程 Runnable對象new Thread(this).start();}/*** 重載onDraw方法* @param canvas*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//設置畫筆顏色paint.setColor(Color.RED);canvas.drawColor(Color.WHITE);//繪制直線canvas.drawLine(50, 50, 450, 50, paint);//繪制矩形canvas.drawRect(100, 100, 200, 600, paint);//繪制矩形canvas.drawRect(300, 100, 400, 600, paint);}@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();}// 更新界面,會自動調用onDraw()一次 參考:http://www.jianshu.com/p/457d74f443e2//postInvalidate()是重繪的,也就是調用postInvalidate()后系統會重新調用onDraw方法畫一次postInvalidate();}} }在這段代碼中,自定義了MyGraphics類,該類繼承于View類,并構建了Paint對象。這里重載了onDraw方法,在其中使用setColor方法來設置畫筆為紅色,接著使用該畫筆在Canvas畫布上繪制了直線和矩形。
完成以上設置之后,還需要在Activity中設置顯示這個自定義的View,通過setContentView方法來實現
import android.support.v7.app.AppCompatActivity; import android.os.Bundle;public class PaintColor extends AppCompatActivity {//聲明自定義View對象 private MyGraphics myGraphics;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//創建自定義View對象myGraphics = new MyGraphics(this);//設置顯示自定義ViewsetContentView(myGraphics);} }由于設置了畫筆為紅色,因此直線和矩形均為紅色。這段代碼同時也演示了Android中繪圖操作的流程,一般是通過重載View類中的onDraw方法來實現的。
setAlpha方法:設置透明度
【功能說明】該方法用于設置畫筆的透明度,直觀上表現為顏色變淡,具有一定的透明效果。該方法經常用于一些圖片重疊或者特效顯示的場合。
【基本語法】public void setAlpha (int a)
其中,參數a為透明度,取值范圍為0~255,數值越小越透明。
【實例演示】下面通過代碼來演示如何設置畫筆透明度。
其余代碼同setColor,只貼出關鍵代碼~
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//設置畫筆顏色paint.setColor(Color.RED);// 設置畫布的顏色canvas.drawColor(Color.WHITE);//設置畫筆的透明度paint.setAlpha(100);// 設置畫筆為空心//paint.setStyle(Paint.Style.STROKE);//繪制直線canvas.drawLine(50, 50, 450, 50, paint);//繪制矩形canvas.drawRect(100, 100, 200, 600, paint);//繪制矩形canvas.drawRect(300, 100, 400, 600, paint);}在這段代碼中,首先設置了畫筆的顏色,然后設置透明度為100,接著用此畫筆來繪制直線和矩形。
setStyle方法:設置風格
【功能說明】該方法用于設置畫筆的風格,可以指定是實心還是空心。該方法在矩形、圓形等圖形上有明顯的效果。
【基本語法】public void setStyle ( Paint.Style style)
其中,參數style為畫筆的風格,為Paint.Style類型,可以取值如下。
Style.FILL:實心。
Style.STROKE:空心。
Style.FILL_AND_STROKE:同時實心和空心,該參數在某些場合會帶來不可預期的顯示效果。
【實例演示】下面通過代碼來演示如何設置畫筆為空心的風格。
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//設置畫筆顏色paint.setColor(Color.RED);// 設置畫布的顏色canvas.drawColor(Color.WHITE);//設置畫筆的透明度//paint.setAlpha(100);// 設置畫筆為空心paint.setStyle(Paint.Style.STROKE);//繪制直線canvas.drawLine(50, 50, 450, 50, paint);//繪制矩形canvas.drawRect(100, 100, 200, 600, paint);//繪制矩形canvas.drawRect(300, 100, 400, 600, paint);}在這段代碼中,首先設置了畫筆的顏色,然后通過setStyle設置畫筆為空心,接著用此畫筆來繪制直線和矩形。
setStrokeWidth方法:設置空心線寬
【功能說明】該方法用于設置畫筆的空心線寬。該方法在矩形、圓形等圖形上有明顯的效果。
【基本語法】public void setStrokeWidth (float width)
其中,參數width為線寬,浮點型數據。
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//設置畫筆顏色paint.setColor(Color.RED);// 設置畫布的顏色canvas.drawColor(Color.WHITE);//設置畫筆的透明度//paint.setAlpha(100);// 設置畫筆為空心paint.setStyle(Paint.Style.STROKE);// 設置線寬paint.setStrokeWidth((float) 10.0);//繪制直線canvas.drawLine(50, 50, 450, 50, paint);//繪制矩形canvas.drawRect(100, 100, 200, 600, paint);//繪制矩形canvas.drawRect(300, 100, 400, 600, paint);}在這段代碼中,首先設置了畫筆的顏色,然后通過setStyle設置畫筆為空心,接著通過setStrokeWidth方法設置線寬。最后,用此畫筆來繪制直線和矩形。
setTextSize方法:設置字體大小
【功能說明】該方法用于設置畫筆的字體大小。該方法主要用在繪制字符串的場合,對于一些圖形則沒有效果。
【基本語法】public void setTextSize (float textSize)
其中,參數textSize為字體大小,浮點型數據
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setColor(Color.RED); //設置畫筆顏色canvas.drawColor(Color.WHITE);paint.setTextSize(20); //設置畫筆字體的大小canvas.drawText("小工匠的進階之路", 10, 50, paint);paint.setTextSize(30); //設置畫筆字體的大小canvas.drawText("小工匠的進階之路", 10, 150, paint);paint.setTextSize(40); //設置畫筆字體的大小canvas.drawText("小工匠的進階之路", 10, 250, paint);paint.setTextSize(50); //設置畫筆字體的大小canvas.drawText("小工匠的進階之路", 10, 350, paint);}這段代碼中,首先設置了畫筆的顏色,然后通過setTextSize方法設置字體大小,并通過此畫筆繪制字符串。
setTypeface方法:設置字體樣式
【功能說明】該方法用于設置畫筆的字體樣式,可以指定系統自帶的字體,也可以使用自定義的字體。該方法是設置畫筆顯示文本字體的最常用方法。
【基本語法】public Typeface setTypeface ( Typeface typeface)
其中,參數typeface為字體樣式,具有如下幾種取值。
Typeface.DEFAULT:默認字體。
Typeface.DEFAULT_BOLD:加粗字體。
Typeface.MONOSPACE:monospace字體。
Typeface.SANS_SERIF:sans字體。
Typeface.SERIF:serif字體。
//重載onDraw方法 protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(Color.RED); //設置畫筆顏色 paint.setTypeface(Typeface.SANS_SERIF); //設置字體樣式 canvas.drawColor(Color.WHITE); paint.setTextSize(20); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 50, paint); paint.setTextSize(30); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 150, paint); paint.setTextSize(40); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 250, paint); paint.setTextSize(50); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 350, paint); }這段代碼中,首先設置了畫筆的顏色,然后使用setTypeface方法設置字體樣式,并通過setTextSize方法設置字體大小,最后使用此畫筆繪制字符串。
setTextScaleX方法:設置比例因子
【功能說明】該方法用于設置畫筆字體的比例因子,默認為1,當大于1的時候表示橫向拉伸,當小于1的時候表示橫向壓縮。該方法往往用于一些特效字體的顯示場合。
【基本語法】public void setTextScaleX (float scaleX)
其中,參數scaleX為字體比例因子,當大于1的時候表示橫向拉伸,當小于1的時候表示橫向壓縮。
【實例演示】下面通過代碼來演示如何設置拉伸的字體。
protected void onDraw(Canvas canvas) { //重載onDraw方法 // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.RED); //設置畫筆顏色 paint.setTypeface(Typeface.SANS_SERIF); //設置字體樣式 canvas.drawColor(Color.WHITE); paint.setTextScaleX(2); //設置比例因子 paint.setTextSize(20); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 50, paint); paint.setTextSize(30); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 150, paint); paint.setTextScaleX((float) 0.7); //設置比例因子 paint.setTextSize(40); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 250, paint); paint.setTextSize(50); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 350, paint); }這段代碼中,首先設置了畫筆的顏色,然后使用setTypeface方法設置字體樣式,之后使用setTextScaleX方法設置比例因子。接著,通過setTextSize方法設置字體大小,最后使用此畫筆繪制字符串。
setARGB方法:設置透明度和顏色
【功能說明】該方法用于設置畫筆的顏色和透明度,其中顏色采用的是RGB數值的方式指定。該方法的功能相當于setColor方法和setAlpha方法,使用非常方便。
【基本語法】public void setARGB (int a, int r, int g, int b)
參數說明
a:透明度,取值范圍為0~255,數值越小越透明。
r:紅色的顏色值,取值范圍為0~255。
g:綠色的顏色值,取值范圍為0~255。
b:藍色的顏色值,取值范圍為0~255。
【實例演示】下面通過代碼來演示如何設置字體顏色。
protected void onDraw(Canvas canvas) { //重載onDraw方法 // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.RED); //設置畫筆顏色 canvas.drawColor(Color.WHITE); paint.setARGB(255, 0, 0, 0); //設置字體顏色 paint.setTextSize(20); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 50, paint); paint.setARGB(255, 255, 0, 0); //設置字體顏色 paint.setTextSize(30); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 150, paint); paint.setARGB(255, 0, 255, 0); //設置字體顏色 paint.setTextSize(40); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 250, paint); paint.setARGB(255, 0, 0, 255); //設置字體顏色 paint.setTextSize(50); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 350, paint); }這段代碼中,分別顯示了四行字符串,在繪制每一個字符串之前,均采用setARGB方法設置透明度和顏色,使用setTextSize方法設置字體大小。
setUnderlineText方法:設置下畫線
【功能說明】該方法用于設置畫筆的下畫線。該方法主要用于繪制字符串的場合,對于其他一些圖形則沒有效果。
【基本語法】public void setUnderlineText (boolean underlineText)
其中,參數underlineText表示是否顯示下畫線,ture表示顯示下畫線,false表示不顯示下畫線。
【實例演示】下面通過代碼來演示如何設置顯示字體下畫線。
protected void onDraw(Canvas canvas) { //重載onDraw方法 // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.RED); //設置畫筆顏色 canvas.drawColor(Color.WHITE); paint.setUnderlineText(true); //設置下畫線 paint.setARGB(255, 0, 0, 0); //設置字體顏色 paint.setTextSize(20); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 50, paint); paint.setARGB(255, 255, 0, 0); //設置字體顏色 paint.setTextSize(30); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 150, paint); paint.setARGB(255, 0, 255, 0); //設置字體顏色 paint.setTextSize(40); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 250, paint); paint.setARGB(255, 0, 0, 255); //設置字體顏色 paint.setTextSize(50); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 350, paint); }這段代碼中,首先使用setUnderlineText方法設置顯示下畫線,然后分別顯示了四行字符串,在繪制每一個字符串之前,均設置透明度、顏色和字體大小。
setTextSkewX方法:設置傾斜因子
功能說明】該方法用于設置畫筆的傾斜因子,默認為0,正數表示向左傾斜,負數表示向右傾斜。該方法主要用于繪制字符串的場合,對于其他一些圖形則沒有效果。
【基本語法】public void setTextSkewX (float skewX)
其中,參數skewX為傾斜因子,正數表示向左傾斜,負數表示向右傾斜。
【實例演示】下面通過代碼來演示如何設置顯示傾斜字體。
protected void onDraw(Canvas canvas) { //重載onDraw方法 // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.RED); //設置畫筆顏色 canvas.drawColor(Color.WHITE); paint.setTextSkewX((float) -1.0); //設置傾斜因子 paint.setARGB(255, 0, 0, 0); //設置字體顏色 paint.setTextSize(20); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 50, paint); paint.setARGB(255, 255, 0, 0); //設置字體顏色 paint.setTextSize(30); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 150, paint); paint.setARGB(255, 0, 255, 0); //設置字體顏色 paint.setTextSize(40); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 250, paint); paint.setARGB(255, 0, 0, 255); //設置字體顏色 paint.setTextSize(50); //設置畫筆字體的大小 canvas.drawText("Hello Android!", 10, 350, paint);這段代碼中,首先使用setTextSkewX方法設置顯示傾斜因子,然后分別顯示了四行字符串,在繪制每一個字符串之前,均設置透明度、顏色和字體大小。
Canvas類:畫布
Android系統中的繪圖操作主要是在Canvas畫布上進行的,在繪圖時,使用的是前面設置好的Paint畫筆。在Android系統中,Canvas類提供了很多常用的圖形,例如直線、矩形、圓形、文字等等。同時,我們也可以對畫布設置顏色、尺寸等。Canvas畫布是主要的繪圖場所。
drawColor方法:設置背景顏色
【功能說明】該方法用于設置畫布的背景顏色,可以通過Color類中的預定義顏色來設置,也可以通過指定RGB值來設置。該方法是設置顏色的主要方法,通過改變畫布顏色,可以繪制出色彩繽紛的背景。
【基本語法】public void drawColor (int color)
其中,參數color為顏色值。也可以直接使用系統Color類中定義的顏色。讀者可以參閱Paint類中的setColor方法。
【實例演示】下面通過代碼來演示如何設置畫布的背景顏色。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.YELLOW); //設置背景顏色 canvas.drawLine(50, 50, 450, 50, paint); //繪制直線 canvas.drawRect(100, 100, 200, 600, paint); //繪制矩形 canvas.drawRect(300, 100, 400, 600, paint); //繪制矩形 }這段代碼中,首先設置了畫筆的顏色為黑色,然后設置畫布的背景顏色為黃色,接著使用該畫筆在畫布上繪制了直線和矩形。
drawLine方法:繪制直線
【功能說明】該方法用于在畫布上繪制直線,通過指定直線的兩個端點坐標來繪制。該方法只能繪制單條直線;如果需要同時繪制多條直線,則可以使用drawLines方法。
【基本語法】public void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
參數說明
startX:起始端點的X坐標。
startY:起始端點的Y坐標。
stopX:終止端點的X坐標。
stopY:終止端點的Y坐標。
paint:繪制直線所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制直線。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //設置背景顏色 paint.setStrokeWidth((float) 1.0); //設置線寬 canvas.drawLine(50, 50, 450, 50, paint); //繪制直線 paint.setStrokeWidth((float) 5.0); //設置線寬 canvas.drawLine(50, 150, 450, 150, paint); //繪制直線 paint.setStrokeWidth((float) 10.0); //設置線寬 canvas.drawLine(50, 250, 450, 250, paint); //繪制直線 paint.setStrokeWidth((float) 15.0); //設置線寬 canvas.drawLine(50, 350, 450, 350, paint); //繪制直線 paint.setStrokeWidth((float) 20.0); //設置線寬 canvas.drawLine(50, 450, 450, 450, paint); //繪制直線 }這段代碼中,首先為畫筆設置了顏色,然后將畫布的背景設置為白色,接著繪制了4條直線,每條直線的線寬都不一樣
drawLines方法:繪制多條直線
【功能說明】該方法用于在畫布上繪制多條直線,通過指定直線的端點坐標數組來繪制。該方法可以繪制多條直線,非常靈活。
【基本語法】public void drawLines (float[] pts, Paint paint)
參數說明
pts:繪制直線的端點數組,每條直線占用4個數據。
paint:繪制直線所使用的畫筆。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 float[] pts={50,50,400,50, 400,50,400,600, 400,600,50,600, 60,600,50,50}; //數據 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 5.0); //線寬 canvas.drawLines(pts, paint); //繪制多條直線 }這段代碼中,首先設置畫筆的顏色,然后初始化一個數組代表繪制直線的各個端點,這里每一行4個數組,前兩個為起始端點,后兩個為終止端點,這里共繪制了4條直線,構成一個封閉的圖形。
drawLines方法:有選擇地繪制多條直線
【功能說明】該方法用于在畫布上繪制多條直線,通過指定直線的端點坐標數組來繪制。該方法可以繪制多條直線,同時也可以指定哪些線段繪制,而哪些線段不繪制,更加靈活。
【基本語法】public void drawLines (float[] pts, int offset, int count, Paint paint)
參數說明
pts:繪制直線的端點數組,每條直線占用4個數據。
offset:跳過的數據個數,這些數據將不參與繪制過程。
count:實際參與繪制的數據個數。
paint:繪制直線所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上有選擇地繪制直線。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 float[] pts={50,50,400,50, 400,50,400,600, 400,600,50,600, 60,600,50,50}; //數據 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 5.0); //線寬 canvas.drawLines(pts,4,12,paint); //有選擇地繪制直線 }在這段代碼中,首先設置畫筆的顏色,然后初始化一個數組代表繪制直線的各個端點。接著,設置畫布的背景為白色,在繪制直線時調用drawLines方法,指定跳過前4個數據,取出12個數據繪制直線。
drawPoint方法:繪制點
【功能說明】該方法用于在畫布上繪制一個點,通過指定端點坐標來繪制。該方法只能繪制單個點;如果需要同時繪制多個點,則可以使用drawPoints方法。
【基本語法】public void drawPoint (float x, float y, Paint paint)
參數說明
x:繪制點的X坐標。
y:繪制點的Y坐標。
paint:繪制直線所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制一個點
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 20.0); //線寬 canvas.drawPoint(300,300,paint); //繪制點 }這段代碼中,首先設置畫筆顏色,然后設置畫布為白色背景。接著設置了線寬,這里就代表了點的大小。最后,通過drawPoint方法繪制了一個點。
drawPoints方法:繪制多個點
【功能說明】該方法用于在畫布上繪制多個點,通過指定端點坐標數組來繪制。該方法可以繪制多個點,同時也可以指定哪些點繪制,而哪些點不繪制,非常靈活。
【基本語法】drawPoints方法可以采用如下兩種形式:
public void drawPoints (float[] pts, Paint paint)
public void drawPoints (float[] pts, int offset, int count, Paint paint)
參數說明
pts:繪制端點的數組,每個端點占用兩個數據。
offset:跳過的數據個數,這些數據將不參與繪制過程。
count:實際參與繪制的數據個數。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制多個點。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setColor(Color.BLACK); //設置畫筆顏色 float[] pts={50,50, 400,50, 400,600, 60,600, }; //數據 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 20.0); //線寬 canvas.drawPoints(pts,paint); //繪制點 }在這段代碼中,首先設置畫筆的顏色,然后初始化一個數組代表繪制的各個端點。接著,設置畫布的背景為白色,并設置了代表點大小的線寬。最后,調用drawPoints方法來繪制點。
drawRect方法:繪制矩形
【功能說明】該方法用于在畫布上繪制矩形,可以通過指定矩形的四條邊來實現,也可以通過指定Rect對象來實現。同時也可以通過設置畫筆的空心效果來繪制空心的矩形。
【基本語法】drawRect方法可以采用如下幾種形式:
public void drawRect (Rect r, Paint paint)
public void drawRect (RectF rect, Paint paint)
public void drawRect (float left, float top, float right, float bottom, Paint paint)
參數說明
r:Rect對象。
rect:RectF對象。
left:矩形的左邊位置。
top:矩形的上邊位置。
right:矩形的右邊位置。
bottom:矩形的下邊位置。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制矩形。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); //空心效果 Rect r=new Rect(); //Rect對象 r.left=50; //左邊 r.top=50; //上邊 r.right=450; //右邊 r.bottom=250; //下邊 canvas.drawRect(r, paint); //繪制矩形 canvas.drawRect(50, 400, 450, 600, paint); //繪制矩形 }在這段代碼中,首先設置了畫筆的顏色,并設置畫布為白色背景。接著設置畫筆的線寬以及空心效果,這樣將繪制出空心矩形。最后,調用drawRect方法在畫布上繪制了兩個矩形。第一種方法采用Rect對象的方式,第二種方法通過指定矩形四個邊的方式。
drawRoundRect方法:繪制圓角矩形
【功能說明】該方法用于在畫布上繪制圓角矩形,通過指定RectF對象以及圓角半徑來實現。該方法是繪制圓角矩形的主要方法,同時也可以通過設置畫筆的空心效果來繪制空心的圓角矩形。
【基本語法】public void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
參數說明
rect:RectF對象。
rx:x方向上的圓角半徑。
ry:y方向上的圓角半徑。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制圓角矩形。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); //空心效果 Rect r1=new Rect(); //Rect對象 r1.left=50; //左邊 r1.top=50; //上邊 r1.right=450; //右邊 r1.bottom=250; //下邊 canvas.drawRect(r1, paint); //繪制矩形 RectF r2=new RectF(); //RectF對象 r2.left=50; //左邊 r2.top=400; //上邊 r2.right=450; //右邊 r2.bottom=600; //下邊 canvas.drawRoundRect(r2, 10, 10, paint); //繪制圓角矩形 }在這段代碼中,首先設置了Paint畫筆的顏色,并設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果,這樣將繪制出空心矩形。最后,調用drawRect方法在畫布上繪制了一個矩形,調用drawRoundRect方法在畫布上繪制了一個圓角矩形。
drawCircle方法:繪制圓形
【功能說明】該方法用于在畫布上繪制圓形,通過指定圓形圓心的坐標和半徑來實現。該方法是繪制圓形的主要方法,同時也可以通過設置畫筆的空心效果來繪制空心的圓形。
【基本語法】public void drawCircle (float cx, float cy, float radius, Paint paint)
參數說明
cx:圓心的x坐標。
cy:圓心的y坐標。
radius:圓的半徑。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制圓形。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); //空心效果 canvas.drawCircle(50, 50, 10, paint); //繪制圓形 canvas.drawCircle(100, 100, 20, paint); //繪制圓形 canvas.drawCircle(150, 150, 30, paint); //繪制圓形 canvas.drawCircle(200, 200, 40, paint); //繪制圓形 canvas.drawCircle(250, 250, 50, paint); //繪制圓形 canvas.drawCircle(300, 300, 60, paint); //繪制圓形 canvas.drawCircle(350, 350, 70, paint); //繪制圓形 }在這段代碼中,首先設置了Paint畫筆的顏色,并設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果,這樣將繪制出空心圓形。最后,調用drawCircle方法繪制了多個圓形,坐標和半徑都在不斷變化。
drawOval方法:繪制橢圓形
【功能說明】該方法用于在畫布上繪制橢圓形,通過指定橢圓外切矩形的RectF對象來實現。該方法是繪制橢圓形的主要方法,同時也可以通過設置畫筆的空心效果來繪制空心的橢圓形。
【基本語法】public void drawOval (RectF oval, Paint paint)
參數說明
oval:橢圓外切矩形的RectF對象。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制橢圓形。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); RectF oval=new RectF(); //RectF對象 oval.left=100; //左邊 oval.top=100; //上邊 oval.right=400; //右邊 oval.bottom=300; //下邊 canvas.drawOval(oval, paint); //繪制橢圓 oval.left=150; //左邊 oval.top=400; //上邊 oval.right=350; //右邊 oval.bottom=700; //下邊 canvas.drawOval(oval, paint); //繪制橢圓 }在這段代碼中,首先設置了Paint畫筆的顏色,并設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果,這樣將繪制出空心橢圓形。最后,通過RectF對象來指定橢圓形的外切矩形,并依此來繪制橢圓。
drawPath方法:繪制任意多邊形
【功能說明】該方法用于在畫布上繪制任意多邊形,通過指定Path對象來實現。在Path對象中規劃了多邊形的路徑信息。該方法是繪制任意多邊形的主要方法,當然也可以使用drawLines方法來實現,但是drawPath方法更為靈活、方便。
【基本語法】public void drawPath (Path path, Paint paint)
參數說明
path:包含路徑信息的Path對象。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制任意多邊形。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); Path path = new Path(); //Path對象 path.moveTo(50, 100); //起始點 path.lineTo(50, 300); //連線到下一點 path.lineTo(100, 500); //連線到下一點 path.lineTo(400, 500); //連線到下一點 path.lineTo(300, 300); //連線到下一點 path.lineTo(450, 50); //連線到下一點 path.lineTo(200, 200); //連線到下一點 canvas.drawPath(path, paint); //繪制任意多邊形 }在這段代碼中,首先設置了Paint畫筆的顏色,并設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果。然后,定義一個Path對象,并通過moveTo方法設置起始點,使用lintTo方法連線到下一點。最后,調用drawPath方法來繪制任意多邊形。
drawArc方法:繪制圓弧
【功能說明】該方法用于在畫布上繪制圓弧,通過指定圓弧所在的橢圓對象、起始角度、終止角度來實現。該方法是繪制圓弧的主要方法。
【基本語法】public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
參數說明
oval:圓弧所在的橢圓對象。
startAngle:圓弧的起始角度。
sweepAngle:圓弧的角度。
useCenter:是否顯示半徑連線,true表示顯示圓弧與圓心的半徑連線,false表示不顯示。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制圓弧。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); RectF oval=new RectF(); //RectF對象 oval.left=100; //左邊 oval.top=100; //上邊 oval.right=400; //右邊 oval.bottom=300; //下邊 canvas.drawArc(oval, 225, 90, false, paint); //繪制圓弧 //RectF oval=new RectF(); //RectF對象 oval.left=100; //左邊 oval.top=400; //上邊 oval.right=400; //右邊 oval.bottom=700; //下邊 canvas.drawArc(oval, 200, 135, true, paint); //繪制圓弧 }在這段代碼中,首先設置了Paint畫筆的顏色,并設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果。然后,定義一個RectF對象,并設置了其坐標,調用drawArc方法繪制第一個圓弧,這里設置不顯示半徑連線。最后,重新設置了RectF對象坐標,調用drawArc方法繪制第二個圓弧,這里設置顯示半徑連線。
drawText方法:繪制字符串
【功能說明】該方法用于在畫布上繪制字符串,通過指定字符串的內容和顯示的位置來實現。在畫布上繪制字符串是經常用到的操作,Android系統提供了非常靈活的繪制字符串的方法,可以根據不同的需要調用不同的方法來實現。字體的大小、樣式等信息都需要在Paint畫筆中來指定。
【基本語法】drawText方法可以采用如下幾種形式:
public void drawText (String text, float x, float y, Paint paint)
public void drawText (char[] text, int index, int count, float x, float y, Paint paint)
public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
public void drawText (String text, int start, int end, float x, float y, Paint paint)
參數說明
text:字符串內容,可以采用String格式,也可以采用char字符數組形式。
x:顯示位置的x坐標。
y:顯示位置的y坐標。
index:顯示的起始字符位置。
count:顯示字符的個數。
start:顯示的起始字符位置。
end:顯示的終止字符位置。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制字符串。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setTextSize((float) 30.0); //設置字體大小 String str="Android應用程序開發"; //字符串 char[] ch={'H','e','l','l','o',' ','A','n','d','r','o','i','d'}; //字符數組 canvas.drawText(str, 50, 200, paint); //繪制字符串 canvas.drawText(ch, 0, ch.length, 50, 300, paint); //繪制字符串 canvas.drawText(str+" API詳解", 0, str.length()+6, 50, 400, paint);//繪制字符串 canvas.drawText(str, 7, str.length(), 50, 500, paint); //繪制字符串 }在這段代碼中,首先設置了畫筆的屬性以及畫布的背景顏色,然后初始化了字符串和字符數組。接著,分別調用drawText的4種方式來在畫布上繪制字符串。
drawPostText方法:指定位置繪制文本
/*** 在指定的位置繪制文本* <p/>* void drawPosText(char[] text, int index, int count, float[] pos, Paint paint)* Draw the text in the array, with each character's origin specified by the pos array.* <p/>* void drawPosText(String text, float[] pos, Paint paint)* Draw the text in the array, with each character's origin specified by the pos array.** @param canvas*/private void drawPostTextMethod(Canvas canvas) {paint.setAntiAlias(true); //設置畫筆為無鋸齒paint.setColor(Color.BLACK); //設置畫筆顏色canvas.drawColor(Color.WHITE); //白色背景paint.setTextSize((float) 30.0);String text = "小工匠的進階之旅";canvas.drawPosText(text,new float[]{50, 50,100, 100,150, 150,200, 200,250, 250,300, 300,350, 350,400, 400},paint);}drawBitmap方法:繪制圖像
【功能說明】該方法用于在畫布上繪制圖像,通過指定Bitmap對象來實現。前面的各個方法都是自己繪制各個圖形,但我們的應用程序往往需要直接引用一些圖片資源。這個時候,便可以使用drawBitmap方法來在畫布上直接顯示圖像。
【基本語法】public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
參數說明
bitmap:Bitmap對象,代表了圖像資源。
left:圖像顯示的左邊位置。
top:圖像顯示的上邊位置。
paint:繪制時所使用的畫筆。
【實例演示】下面通過代碼來演示如何在畫布上繪制圖像。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //線寬 paint.setStyle(Style.STROKE); Bitmap bitmap=null; //Bitmap對象 bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.icon)).getBitmap(); canvas.drawBitmap(bitmap, 50, 50, null); //繪制圖像 bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.bulb_on)).getBitmap(); canvas.drawBitmap(bitmap, 50, 150, null); //繪制圖像 bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.bulb_off)).getBitmap(); canvas.drawBitmap(bitmap, 50, 450, null); //繪制圖像 }在這段代碼中,首先初始化畫筆和畫布,然后聲明了一個Bitmap對象。接著,從資源文件中獲取圖片資源,并使用drawBitmap方法將圖片顯示在畫布上
save方法:鎖定畫布
【功能說明】該方法用于鎖定畫布,這種方法主要用于鎖定畫布中的某一個或幾個對象,對鎖定對象操作的場合。使用save方法鎖定畫布并完成操作之后,需要使用restore方法解除鎖定。
【基本語法】public int save ()
save方法的具體應用可以參考rotate方法的示例代碼。
restore方法:解除鎖定
【功能說明】該方法用于解除鎖定的畫布,這種方法主要用在save方法之后。使用save方法鎖定畫布并完成操作之后,需要使用restore方法解除鎖定。
【基本語法】public void restore ()
restore方法的具體應用可以參考rotate方法的示例代碼。
clipRect方法:設置裁剪區
【功能說明】該方法用于裁剪畫布,也就是設置畫布的顯示區域。在使用時,可以使用Rect對象來指定裁剪區,也可以通過指定矩形的4條邊來指定裁剪區。該方法主要用于部分顯示以及對畫布中的部分對象進行操作的場合。
【基本語法】clipRect方法有如下幾種形式:
public boolean clipRect (Rect rect)
public boolean clipRect (float left, float top, float right, float bottom)
public boolean clipRect (int left, int top, int right, int bottom)
參數說明
rect:Rect對象,用于定義裁剪區的范圍。
left:矩形裁剪區的左邊位置,可以是浮點型或者整型。
top:矩形裁剪區的上邊位置,可以是浮點型或者整型。
right:矩形裁剪區的右邊位置,可以是浮點型或者整型。
bottom:矩形裁剪區的下邊位置,可以是浮點型或者整型。
【實例演示】下面通過代碼來演示如何設置畫筆的顯示區域。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 paint.setTextSize((float) 30.0); //設置字體大小 canvas.clipRect(100, 100, 350, 600); //設置顯示范圍 canvas.drawColor(Color.WHITE); //白色背景 canvas.drawText("Hello Android!", 150, 300, paint); //繪制字符串 }在這段代碼中,首先設置了畫筆的顏色和字體大小,然后通過clipRect方法設置了顯示范圍,并通過drawColor方法設置背景顏色為白色。最后,調用drawText方法在畫布上繪制字符串。
rotate方法:旋轉畫布
【功能說明】該方法用于旋轉畫布,通過旋轉畫布,可以將畫布上繪制的對象旋轉。在使用這個方法的時候,將會把畫布上的所有對象都旋轉。為了只對某一個對象進行旋轉,則可以通過save方法鎖定畫布,然后執行旋轉操作,最后通過restore方法解鎖,此后再繪制其他圖形。
【基本語法】rotate方法有如下幾種形式:
public void rotate (float degrees)
public final void rotate (float degrees, float px, float py)
參數說明
degrees:旋轉的角度,正數為順時針方向,負數為逆時針方向。
px:旋轉點的x坐標。
py:旋轉點的y坐標。
【實例演示】下面通過代碼來演示如何旋轉畫布上的一個對象。
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //設置畫筆為無鋸齒 paint.setColor(Color.BLACK); //設置畫筆顏色 paint.setTextSize((float) 30.0); //設置字體大小 canvas.drawColor(Color.WHITE); //白色背景 canvas.clipRect(50, 50, 400, 700); //設置裁剪區 canvas.save(); //鎖定畫布 canvas.rotate(45, 230, 250); //旋轉45? paint.setColor(Color.BLUE); //設置畫筆顏色 canvas.drawText("Hello Android!", 130, 250, paint); //繪制字符串 canvas.restore(); //解除鎖定 paint.setColor(Color.RED); //設置畫筆顏色 canvas.drawText("Hello Android!", 130, 250, paint); //繪制字符串 RectF oval=new RectF(); //RectF對象 oval.left=150; //左邊 oval.top=500; //上邊 oval.right=350; //右邊 oval.bottom=600; //下邊 canvas.drawOval(oval, paint); //繪制橢圓 }在這段代碼中,首先設置了畫布和畫布的參數。接著設置畫布的顯示區,并鎖定畫布,將畫布旋轉45 ,然后在此畫布上繪制字符串,最后解鎖畫布。此后,在同一位置繪制相同的字符串,并繼續繪制了一個橢圓。。
小結
Android中的繪圖操作主要通過Paint畫筆類和Canvas畫布類來實現。本博文詳細介紹了Paint類和Canvas類中的方法,包括點、線、矩形、圓、橢圓、字符串和圖像等各種對象的繪制。通過這些方法,開發者可以美化自己的Android應用程序,開發更絢麗多彩的界面效果。
總結
以上是生活随笔為你收集整理的Android-2D绘图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android绘图机制与处理技巧-更新中
- 下一篇: Android动画效果-更新中