Android基礎入門教程——8.3.1 三個繪圖工具類詳解

來源:互聯網
上載者:User

Android基礎入門教程——8.3.1 三個繪圖工具類詳解
 

上兩小節我們學習了Drawable以及Bitmap,都是載入好圖片的,而本節我們要學習的繪圖相關的
一些API,他們分別是Canvas(畫布),Paint(畫筆),Path(路徑)!本節非常重要,同時也是我們
自訂View的基礎哦~好的,話不多說開始本節內容~
官方API文檔:Canvas;Paint;Path;

1.相關方法詳解1)Paint(畫筆):

就是畫筆,用於設定繪製風格,如:線寬(筆觸粗細),顏色,透明度和填充風格等
直接使用無參構造方法就可以建立Paint執行個體:
Paint paint = new Paint( );
我們可以通過下述方法來設定Paint(畫筆)的相關屬性,另外,關於這個屬性有兩種,
圖形繪製相關與文本繪製相關:

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): 設定圖形重疊時的處理方式,如合并,取交集或並集,經常用來製作橡皮的擦除效果 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): 設定帶有刪除線的效果 setStrokeJoin(Paint.Join join): 設定結合處的樣子,Miter:結合處為銳角,
Round:結合處為圓弧:BEVEL:結合處為直線 setStrokeMiter(float miter):設定畫筆傾斜度 setStrokeCap (Paint.Cap cap):設定轉彎處的風格
其他常用方法: float ascent( ):測量baseline之上至字元最高處的距離
float descent():baseline之下至字元最低處的距離 int breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth):
檢測一行顯示多少文字 clearShadowLayer( ):清除陰影層
其他的自行查閱文檔~
2)Canvas(畫布):

畫筆有了,接著就到畫筆(Canvas),總不能憑空作畫是吧~常用方法如下:

首先是構造方法,Canvas的構造方法有兩種:
Canvas(): 建立一個空的畫布,可以使用setBitmap()方法來設定繪製具體的畫布。
Canvas(Bitmap bitmap): 以bitmap對象建立一個畫布,將內容都繪製在bitmap上,因此bitmap不得為null。
接著是 1.drawXXX()方法族:以一定的座標值在當前畫圖地區畫圖,另外圖層會疊加,
即後面繪畫的圖層會覆蓋前面繪畫的圖層。
比如:

drawRect(RectF rect, Paint paint) :繪製地區,參數一為RectF一個地區 drawPath(Path path, Paint paint) :繪製一個路徑,參數一為Path路徑對象 drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) :
貼圖,參數一就是我們常規的Bitmap對象,參數二是來源區域(這裡是bitmap),
參數三是目的地區域(應該在canvas的位置和大小),參數四是Paint畫刷對象,
因為用到了縮放和展開的可能,當原始Rect不等於目標Rect時效能將會有大幅損失。 drawLine(float startX, float startY, float stopX, float stopY, Paintpaint) :
畫線,參數一起始點的x軸位置,參數二起始點的y軸位置,參數三終點的x軸水平位置,
參數四y軸垂直位置,最後一個參數為Paint 畫刷對象。 drawPoint(float x, float y, Paint paint):
畫點,參數一水平x軸,參數二垂直y軸,第三個參數為Paint對象。 drawText(String text, float x, floaty, Paint paint) :
渲染文本,Canvas類除了上面的還可以描繪文字,參數一是String類型的文本,
參數二x軸,參數三y軸,參數四是Paint對象。 drawOval(RectF oval, Paint paint):畫橢圓,參數一是掃描地區,參數二為paint對象; drawCircle(float cx, float cy, float radius,Paint paint): 繪製圓,參數一是中心點的x軸,參數二是中心點的y軸,參數三是半徑,參數四是paint對象; drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint):
畫弧,參數一是RectF對象,一個矩形地區橢圓形的界限用於定義在形狀、大小、電弧,參數二是起始角
(度)在電弧的開始,參數三掃掠角度(度)開始順時針測量的,參數四是如果這是真的話,包括橢圓中心的電
弧,並關閉它,如果它是假這將是一個弧線,參數五是Paint對象;

2.clipXXX()方法族:在當前的畫圖地區裁剪(clip)出一個新的畫圖地區,這個畫圖地區就是canvas
對象的當前畫圖地區了。比如:clipRect(new Rect()),那麼該矩形地區就是canvas的當前畫圖地區
3.save()restore()方法:
save( ):用來儲存Canvas的狀態。save之後,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作!
restore():用來恢複Canvas之前儲存的狀態。防止save後對Canvas執行的操作對後續的繪製有影響。
save()和restore()要配對使用(restore可以比save少,但不能多),若restore調用次數比save多,會報錯!
4.translate(float dx, float dy):
平移,將畫布的座標原點向左右方向移動x,向上下方向移動y.canvas的預設位置是在(0,0)
5.scale(float sx, float sy):擴大,x為水平方向的放大倍數,y為豎直方向的放大倍數
6.rotate(float degrees):旋轉,angle指旋轉的角度,順時針旋轉

3)Path(路徑)

簡單點說就是描點,連線~在建立好我們的Path路徑後,可以調用Canvas的drawPath(path,paint)
將圖形繪製出來~常用方法如下:

addArc(RectF oval, float startAngle, float sweepAngle:為路徑添加一個多邊形 addCircle(float x, float y, float radius, Path.Direction dir):給path添加圓圈 addOval(RectF oval, Path.Direction dir):添加橢圓形 addRect(RectF rect, Path.Direction dir):添加一個地區 addRoundRect(RectF rect, float[] radii, Path.Direction dir):添加一個圓角地區 isEmpty():判斷路徑是否為空白 transform(Matrix matrix):應用矩陣變換 transform(Matrix matrix, Path dst):應用矩陣變換並將結果放到新的路徑中,即第二個參數。

更進階的效果可以使用PathEffect類!
幾個To:

moveTo(float x, float y):不會進行繪製,只用於移動移動畫筆 lineTo(float x, float y):用於直線繪製,預設從(0,0)開始繪製,用moveTo移動!
比如
mPath.lineTo(300, 300);
canvas.drawPath(mPath, mPaint); quadTo(float x1, float y1, float x2, float y2):
用於繪製圓滑曲線,即貝茲路徑,同樣可以結合moveTo使用!
rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)
同樣是用來實現貝茲路徑的。 (x1,y1) 為控制點,(x2,y2)為控制點,(x3,y3) 為結束點。
Same as cubicTo, but the coordinates are considered relative to the current point
on this contour.就是多一個控制點而已~
繪製上述的曲線:
mPath.moveTo(100, 500);
mPath.cubicTo(100, 500, 300, 100, 600, 500);
如果不加上面的那個moveTo的話:則以(0,0)為起點,(100,500)和(300,100)為控制點繪製貝茲路徑
arcTo(RectF oval, float startAngle, float sweepAngle):
繪製弧線(實際是截取圓或橢圓的一部分)ovalRectF為橢圓的矩形,startAngle 為開始角度,
sweepAngle 為結束角度。
2.動手試試:

屬性那麼多,肯定要手把手的擼一下,才能加深我們的映像是吧~
嘿嘿,畫圖要麼在View上畫,要麼在SurfaceView上畫,這裡我們在View上畫吧,
我們定義一個View類,然後再onDraw()裡完成繪製工作!

/** * Created by Jay on 2015/10/15 0015. */public class MyView extends View{    private Paint mPaint;    public MyView(Context context) {        super(context);        init();    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init(){        mPaint = new Paint();        mPaint.setAntiAlias(true);          //消除鋸齒        mPaint.setColor(getResources().getColor(R.color.puple));//畫筆顏色        mPaint.setStyle(Paint.Style.FILL);  //畫筆風格        mPaint.setTextSize(36);             //繪製文字大小,單位px        mPaint.setStrokeWidth(5);           //畫筆粗細    }    //重寫該方法,在這裡繪圖    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);    }}    

然後布局那裡設定下這個View就好,下述代碼都寫在onDrawable中~

1)設定畫布顏色:
canvas.drawColor(getResources().getColor(R.color.yellow));   //設定畫布背景顏色
2)繪製圓形:
canvas.drawCircle(200, 200, 100, mPaint);           //畫實心圓

3)繪製矩形:
canvas.drawRect(0, 0, 200, 100, mPaint);            //畫矩形

4)繪製Bitmap:
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher), 0, 0, mPaint);

5)繪製弧形地區:
canvas.drawArc(new RectF(0, 0, 100, 100),0,90,true,mPaint);  //繪製弧形地區

假如true改為false:

6)繪製圓角矩形
canvas.drawRoundRect(new RectF(10,10,210,110),15,15,mPaint); //畫圓角矩形

7)繪製橢圓
canvas.drawOval(new RectF(0,0,200,300),mPaint); //畫橢圓

8)繪製多邊形:
 Path path = new Path(); path.moveTo(10, 10); //移動到 座標10,10 path.lineTo(100, 50); path.lineTo(200,40); path.lineTo(300, 20); path.lineTo(200, 10); path.lineTo(100, 70); path.lineTo(50, 40); path.close(); canvas.drawPath(path,mPaint);

9)繪製文字:
canvas.drawText(最喜歡看曹神日狗了~,50,50,mPaint);    //繪製文字

你也可以沿著某條Path來繪製這些文字:

 Path path = new Path(); path.moveTo(50,50); path.lineTo(100, 100); path.lineTo(200, 200); path.lineTo(300, 300); path.close(); canvas.drawTextOnPath(最喜歡看曹神日狗了~, path, 50, 50, mPaint);    //繪製文字

10)繪製自訂的圖形:

代碼來源於網上:

 protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.translate(canvas.getWidth()/2, 200); //將位置移動畫紙的座標點:150,150        canvas.drawCircle(0, 0, 100, mPaint); //畫圓圈        //使用path繪製路徑文字        canvas.save();        canvas.translate(-75, -75);        Path path = new Path();        path.addArc(new RectF(0,0,150,150), -180, 180);        Paint citePaint = new Paint(mPaint);        citePaint.setTextSize(14);        citePaint.setStrokeWidth(1);        canvas.drawTextOnPath(繪製錶盤~, path, 28, 0, citePaint);        canvas.restore();        Paint tmpPaint = new Paint(mPaint); //小刻度畫筆對象        tmpPaint.setStrokeWidth(1);        float  y=100;        int count = 60; //總刻度數        for(int i=0 ; i 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.