1. 程式人生 > >Android自定義View基礎知識總結

Android自定義View基礎知識總結

自定義View關鍵點

1 自定義繪製的方式是重寫繪製方法,其中最常見的是onDraw()方法。

2 繪製的關鍵點是Canvas的使用

(1)Canvas的繪製類方法:drawXXX(xxx),關鍵引數是Paint。

(2)Canvas的輔助類方法:範圍裁切和幾何變換。

自定義繪製知識的四個級別

1 Canvas類的drawXXX系列方法和Paint最常見的使用。

canvas.drawXXX()方法是自定義繪製最基本的操作。比如怎麼畫圓,怎麼畫方,怎麼畫影象和文字。組合繪製這些內容,再配合上Paint的一些常見方法來對繪製內容的顏色和風格進行簡單的配置。

2 Paint的完全攻略,常見的有設定顏色,實心空心,線條粗細,有沒有陰影。

3 Canvas 對繪製的輔助---範圍裁切和幾何變換

範圍裁切和幾何變換都是用於輔助的。

4 使用不同的繪製方法來控制繪製順序

最重要的onDraw

提前建立好Paint物件,重寫onDraw()方法,把繪製程式碼寫在onDraw()方法裡面。

Paint paint = newPaint();

@OverrideprotectedvoidonDraw(Canvas canvas){
    super.onDraw(canvas);
    
    //繪製一個圓canvas.drawCircle(300,300,200,paint);
}

Canvas.drawXXX()和Paint基礎

1 Canvas類下的所有以draw--開頭的方法,比如 drawCircle()和drawBitmap()。

2 Paint類下的幾個最常用的方法:

Paint.setStyle(Stytle stytle)設定繪製模式

Paint.setColor(Color color)設定顏色

Paint.setStrokeWidth(float width)設定線條寬度

Paint.setTextSize(float textSize)設定文字大小

Paint.setAntiAlias(boolean a)設定抗鋸齒

Canvas.drawColor(int color)顏色填充

這是最基本的drawXXX()方法:在整個繪製區域填充指定的顏色。

比如drawColor(Color.BLACK)會把整個區域塗上純黑色,並且覆蓋掉原有內容;

drawColor(Color.parse(#88880000))會在原有的繪製效果上加一層半透明的紅色遮罩。

類似的方法還有drawRGB(int r, int g ,int b)和drawARGB(int r, int g ,int b)和drawColor()方法作用一樣。

這類顏色填充一般用於繪製之前設定底色,或者在繪製之後為介面設定半透明遮蓋。

drawCircle(float centerX,float centerY,float radius,Paint paint)畫圓

centerX和centerY是圓心的橫縱座標,第三個引數radius是圓的半徑,單位都是畫素,它們共同構成了這個圓的基本資訊。

知識點:在Android裡,每一個View都有一個自己的座標系,彼此之間是不影響的。這個座標系的原點是View左上角的那個點;

如果要畫一個紅色的圓需要這些寫:

panit.setColor(Color.RED);
canvas.drawCircle(300,300,200,panit);

如果想空心圓,那就要設定繪製模式

paint.setStyle(Paint.Style.STROKE);//style修改為劃線模式canvas.drawCircle(300,300,200,paint);

setStyle(Style style)這個方法設定的是繪製模式,style具體有三種:

FILL:填充模式

STROKE是畫線模式

FILL_AND_STROKE兩種模式一併使用,既畫線又填充。它的預設值是FILL,填充模式。

還可以設定畫線的粗細,在STROKE,FILL_AND_STROKE模式下,還可以設定線條的粗細:

aint.setStyle(Paint.Style.STROKE);
//線條寬度為20畫素
paint.setStrokeWidth(20);
canvas.drawCircle(300,300,200,paint);

在繪製的時候,往往需要開啟抗鋸齒來讓圖形和文字的邊緣更加平滑,設定抗鋸齒的方式有兩種:

paint paint= new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(boolean a);

知識點:鋸齒現象的發生,只是由於圖形解析度過低,導致人眼看到了畫面中的畫素顆粒而已。開啟抗鋸齒後會修改圖形邊緣處的畫素顏色,從而讓圖形在肉眼看來具有更加平滑的感覺.

Canvas還可以畫矩形比如 drawRect(float left,float top, float right, float bottom,Paint paint);

paint.setStyle(Paint.Style.FILL);
canvas.drawRect(100,100,500,500,paint);

paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(100,100,500,500,paint);

另外,它還有兩個過載方法drawRect(RectF rect,Paint paint)和drawRect(Rect rect, Paint paint),讓你可以直接填寫rectF或Rect物件來繪製矩形。

Canvas還可以畫點drawPoint(float x, float y,Paint paint);

x和y是點的橫縱座標,點的大小可以通過paint.setStrokeWidth(float width)來設定;點的形狀可以通過paint.setStrokeCap(cap)來設定,ROUND畫出的是圓形的點,SQUARE或者BUTT畫出的是方形的點。

Paint.setStrokeCap(cap)可以設定點的形狀,但這個方法並不是專門設定點的形狀的,而是一個設定線條端點形狀的方法端點有圓頭(ROUND)平頭(BUTT)方頭(SQUARE)三種。

//畫圓形的點paint.setStrokeWidth(20);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPoint(50,50,paint);

//畫方形的點paint.setStrokeWidth(20);
paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawPoint(50,50,paint);

還可以批量畫點 drawPoints(float[]pts, int offset, int count , Paint paint) 或者 drawPoints(float[]pts, Paint paint)

同樣是畫點,它和drawPoint()的區別是可以畫多個點。pts這個陣列是點的座標,每兩個成一對; offset表示跳過陣列的前幾個數再開始記座標; count表示一共要繪製幾個座標。

float[] points = {0, 0, 50, 50, 100, 100, 50, 100, 100, 50...};

//繪製四個點canvas.drawPoints(points, 2/*跳過兩個數,既前面兩個0*/,8/*一共繪製8個數*(4個點)/,paint);

還可以畫橢圓,drawOval(float left,float top, float rigint, float bottom, Paint paint)

只能繪製橫著的或者豎著的橢圓,不能繪製斜的,如果畫斜著的橢圓,不能直接使用drawOval(),而是需要配合幾何變換。left,top,right,bottom對應著橢圓的左上右下四個邊界的座標

paint.setStyle(Paint.Style.FILL);
canvas.drawOval(50,50,350,200,paint);

paint.setStyle(Paint.Style.Stroke);
canvas.drawOval(400,50,700,200,paint)

它還有一個過載方法drawOval(RectF rectt, Paint paint); 讓你可以直接填寫RectF來繪製橢圓。

還可以畫線,drawLine(float startX, float startY, float StopX, float StopY,Paint paint)

startX, startY, stopX, stopY分別是線的起點座標和終點座標。

//由於直線不是封閉圖形,所以setStyle(style)對直線沒有影響。
canvas.drawLine(200,200,800,500,paint);

還可以批量畫線,drawLines(float[] pts, int offet, int count, Paint paint)或者drawLines(float[]pts, Paint paint)

float[] points = {20,20,120,20,70,20,70,120,20,120,120...};
canvas.drawLines(points,paint);

還可以畫圓角矩形,drawRoundRect(float left,float top, float right, float bottom, float rx, float ry, Paint paint),left ,top ,right, bottom是四條邊的座標,rx,ry是圓角的橫向半徑和縱向半徑

//還有一個過載方法
//直接RectF來繪製圓角矩形。
drawRoundRect(RectF rect, floatrx, floatry,Paint paint);
canvas.drawRoundRect(100,100,500,300,50,50,paint);

還可以繪製圓弧或扇形, drawArc(float left,float top,float right, float bottom, float startAngle, float sweepAngle, boolean useCenter,Paint paint)

drawArc()是使用一個橢圓來描述弧形的。left,top,bottom描述的是這個弧形所在的橢圓;startAngle是弧形的起始角度(x軸的正向,即正右的方向,是0度的位置;順時針為正角度,逆時針是負角度),sweepAngle是弧形滑過的角度;useCenter表示是否連線到圓心,就是弧形,如果連線到圓心,就是扇形。

paint.setStyle(Paint.Style.FILL);
canvas.drawArc(200,100,800,500,-110,100,true,paint);

canvs.drawArc(200,100,800,500,20,140,false,paint);

//畫線模式
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(200,100,800,500,180,60,false,paint);

畫自定義圖形,drawPath(Path path,Paint paint)

前面的這些方法,都是繪製某個給定的圖形,而drawPath(Path path, Paint paint)可以繪製自定義圖形。當你要繪製的圖形比較特殊,使用前面的那些方法做不到的時候,就可以使用drawPath()來繪製。

drawPath(path)這個方法是通過描述路徑的方式來繪製圖形的,它的path引數就是用來描述圖形路徑的物件。path的型別是Path.

public classPathViewextendsView{
   Paint  paint = new Paint();
   Path path = new Path();
   xxx
   {
       //使用path來描述圖形的路徑
       path.addArc(200,200,400,-225,225);
       path.arcTo(400,200,600,400,-180,225,false);
       path.lineTo(400,542);
   }
   
   @Override 
    protectd void onDraw(Canvascanvas){
       super.onDraw(canvas);
       canvas.drawPath(path,paint);
   }
}

Path可以描述直線、二次曲線、三次曲線、圓、橢圓、弧形、矩形、圓角矩形。

Path有兩類方法,一類是直接描述路徑的,另一類是輔助的設定或者計算。

Path方法第一類:直接描述路徑。

這一類方法還可以細分為兩組:新增子圖形和畫線(直線或曲線)

第一組:addXxx()-----新增子圖形

addCircle(float x, float y, float radius,Direction dir)新增圓

x,y,radius這三個引數是圓的基本資訊,最後一個引數dir是畫圓的路徑的方向。

路徑方向有兩種:順時針和逆時針,對於普通情況,這個引數天順時針還是逆時針沒有影響。它只是在填充圖形(Paint.Style為FILL或者FILL_AND_STROKE)

在用addCircle()為Path中新增一個圓後,呼叫canvas.drawPath(path,paint),就能畫一個圓出來。

path.addCircle(300,300,200,Path.Direction.CW)
xxxcanvas.drawPath(path,paint);

drawPath()一般是在繪製組合圖形時才會用到的。其他的Path.add-()方法和這類似

第二組:xxxTo()---畫線(直線或曲線)

這一組和第一組addXxx()方法區別在於,第一組是新增的完整封閉圖形(除了addPath()),而這一組新增的只是一條線。

lineTo(float x, float y) / rLineTo(float x, float y)畫直線

從當前位置向目標位置畫一條直線,x和y是目標位置的座標。這兩個方法區別是,lineTo(x,y)的引數是絕對座標,而rLineTo(x,y)的引數是相對當前位置的相對座標。

所謂當前位置,即最後一次呼叫畫Path的方法的終點位置。初始值為原點(0,0)

paint.setStyle(Style.STROKE);
path.lineTo(100,100);//由當前位置(0,0)向(100,100)畫一條直線path.rLineTo(100,0);//由當前位置(100,100)向正右方100畫素的位置畫線。

drawBitmap(Bitmap bitmap, float left, float top, float right, float bottom, Paint paint)畫Bitmap

繪製Bitmap物件,也就是把這個Bitmap中的畫素內容貼過來,其中left,top是要把bitmap繪製到螢幕的座標。

drawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint);
drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint);
drawBitmap(Bitmap bitmap,Matrix matrix,Paint paint);

drawBitmap還有一個兄弟辦法drawBitmapMesh(),可以繪製具有網格拉伸效果的Bitmap。

drawText(String text, float x, floaty,Paint paint)繪製文字

介面中所有的顯示內容,都是繪製出來的,包括文字。drawText()這個方法就是繪製文字的。引數text是用來繪製的字串,x和y是繪製的起點座標。 canvas.drawText(text, 200, 100, paint);

Paint.setTExtSize(float textSize);可以設定文字的大小。

這些是本次自定義View基礎知識的回顧和常用hi總結,下次準備總結Canvas對繪製的輔助和設定。