Android自定義View-關於Graphics的解釋(一)

一、Paint類對應的方法

1.1 圖形繪製相關方法

方法定義 說明 備註
public void set(Paint src)  根據已有畫筆的屬性進行賦值  
public void setColor(int color) 設置顏色  
public void setAlpha(int alpha) 設置透明度,alpha爲透明度,取值範圍爲0~255,數值越小越透明  
public void setARGB(int a, int r, int g, int b)  設置透明度和顏色,a表明透明度,r,g,b表明顏色值  
public void setAntiAlias(boolean aa) 

設置是否使用抗鋸齒功能,比較耗資源,減慢繪製速度html

 

詳細的解釋見3.1
public void setDither(boolean dither) 

設定是否使用圖像抖動,如true,繪製出來的圖片顏色更飽滿、清晰  java

 

詳細的解釋見3.2
public void setStyle(android.graphics._Original_Paint.Style style) 

設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE  android

說明:當咱們在調用drawCircle、drawOval、drawArc、drawRect等方法時,咱們既能夠繪製對應圖形的填充面,也能夠只繪製該圖形的輪廓線,控制的關鍵在於畫筆Paint中的style。Paint經過setStyle方法設置要繪製的類型,style有取三種值:Paint.Style.FILL、Paint.Style.STROKE和Paint.Style.FILL_AND_STROKE。canvas

當style爲FILL時,繪製是填充面,FILL是Paint默認的style;ide

當style爲STROKE時,繪製的是圖形的輪廓線;性能

當style爲FILL_AND_STROKE時,同時繪製填充面和輪廓線,不過這種狀況用的很少,由於填充面和輪廓線是用同一種顏色繪製的,區分不出輪廓線的效果。字體

public void setStrokeCap(Cap cap)  當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式  Cap.ROUND,或方形樣式Cap.SQUARE    
public void setStrokeWidth(float width)  當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度        

1.2 文字繪製相關方法

方法 說明 備註
public void setTextSize(float textSize) 設置文字大小  
public void setTextScaleX(float scaleX) 設置文字x軸的縮放比例,能夠實現文字的拉伸效果    
public void setTextSkewX(float skewX) 設置文字傾斜弧度   
public void setUnderlineText(boolean flag) 設置文字下劃線效果      
public void setStrikeThruText(boolean flag) 設置刪除線效果  
public Typeface setTypeface(Typeface typeface) 設置字體風格    

接收參數爲 Typeface對象,在Typeface.java類中,比較簡單的,有defaultFromStyle方法返回Typeface對象動畫

代碼:paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));    spa

public void setTextAlign(android.graphics._Original_Paint.Align align) 設置文字的對齊方向   可選LEFT、CENTER和RIGHT。


二、Canvas類對應的方法

2.1  總的說明

 這個類至關於一個畫布,你能夠在裏面畫不少東西;.net

咱們能夠把這個Canvas理解成系統提供給咱們的一塊內存區域(但實際上它只是一套畫圖的API,真正的內存是下面的Bitmap),並且它還提供了一整套對這個內存區域進行操做的方法,全部的這些操做都是畫圖API。也就是說在這種方式下咱們已經能一筆一劃或者使用Graphic來畫咱們所須要的東西了,要畫什麼要顯示什麼都由咱們本身控制。

這種方式根據環境還分爲兩種:一種就是使用普通View的canvas畫圖,還有一種就是使用專門的SurfaceView的canvas來畫圖。兩種的主要是區別就是能夠在SurfaceView中定義一個專門的線程來完成畫圖工做,應用程序不須要等待View的刷圖,提升性能。前面一種適合處理量比較小,幀率比較小的動畫,好比說象棋遊戲之類的;然後一種主要用在遊戲,高品質動畫方面的畫圖。

2.2 draw方法的解釋

方法 說明 代碼例子
設置ARGB、顏色填充畫布 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) {} 
canvas.drawARGB(50, 255, 0, 0);//參數即爲ARGB的值 
畫點 public native void drawPoint(float x, float y, Paint paint);   //參數比較明顯,就是點的座標,須要注意的是,在繪製點以前,須要設置畫筆的寬度,不然不能畫出來  
  paint.setStrokeWidth(13);     
  //另外,還能夠設置畫筆的樣式,來指定所畫的點的樣式,圓形仍是方形  
  paint.setStrokeCap(Paint.Cap.ROUND);//或者paint.setStrokeCap(Paint.Cap.BUTT);  
  canvas.drawPoint(100, 100, paint); 
畫直線 public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {}   canvas.drawLine(100, 100, 500, 500, paint);//參數爲起點和終點的XY座標 
畫圓 public void drawCircle(float cx, float cy, float radius, Paint paint) {}   canvas.drawCircle(200, 200, 100, paint);//參數爲圓心座標和半徑  
繪製矩形 public void drawRect(float left, float top, float right, float bottom, Paint paint) {}  
public void drawRect(RectF rect, Paint paint) {}  
public void drawRect(Rect r, Paint paint) {}  
// RectF 和 Rect  均可用來定義一個矩形區域,主要區別是參數類型不一樣,一個是int類型,一個是float類型  
private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 500);  
canvas.drawRect(mRectF, paint);  
繪製圓角矩形 public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {}   private RectF mRectF;  
mRectF = new RectF(100, 100, 500, 500);//定義一個區域  
canvas.drawRoundRect(mRectF, 20, 50, paint); //第2、三個參數分別定義x和y方向的圓角弧度
繪製一個區域的內切圓或橢圓(視所定義的矩形而定) public void drawOval(RectF oval, Paint paint) {}   private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 500);  
canvas.drawOval(mRectF, paint);
繪製弧形區域 public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint) {} private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 200);//定義一個矩形區域  
canvas.drawArc(mRectF, 0, 90, false, paint);  
//第二個參數爲起始弧度,第三個爲終止弧度,第四個爲顯示方式 
繪製文本 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(String text, int start, int end, float x, float y, Paint paint) {}  
canvas.drawText("hwgt", 100, 100, paint);  
canvas.drawText(new char [] {'h','w','g','t','3','1','3','3'}, 2, 3, 100, 100, paint);  
canvas.drawText("hwgt3133", 2, 4, 100, 100, paint); //含頭不含尾 
按照指定點的座標繪製文本 public void drawPosText(String text, float[] pos, Paint paint) {}  
public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) {} 
canvas.drawPosText("hwgt", new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);  
canvas.drawPosText(new char[]{'h','w','g','t'}, 3, 1, new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);  
//推薦使用第二個方法,if (index < 0 || index + count > text.length || count*2 > pos.length),就會報錯  
按照指定的路徑繪製文本 public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {}    


三、一些方法的重點理解

3.1 setAntiAlias(boolean)方法解釋

該方法做用是抗鋸齒,什麼意思呢,咱們看下效果圖,就知道了 

Paint.setAntiAlias()的做用

左邊是沒有設置抗鋸齒的,右邊是設置了抗鋸齒的,邊界明顯變模糊了。

3.2  setDither(boolean)方法解釋

該方法是設置防抖動。 
咱們先看下沒有設置防抖動的繪製出來的圖 

Paint.setDither()方法的做用

而後咱們看下設置了防抖動的繪製出來的圖 

Paint.setDither()方法的做用

第二個是否是比第一個圖柔和點,這就是防抖動的效果。 

 

3.3  drawRect()方法解釋

該方法是繪製矩形

new Rect(150, 75, 260, 120)  

這個構造方法須要四個參數這四個參數 指明瞭什麼位置 ?咱們就來解釋怎麼畫 這個 矩形 
這四個 參數 分別表明的意思是:left   top   right   bottom  上下左右唄。啊,不是 是 左 上 右 下。 下面給你們解釋  
left : 矩形左邊的X座標  150        ---->圖片中的A點 
top:    矩形頂部的Y座標   75         ---->圖片中的B點 
right :  矩形右邊的X座標   260       ----->圖片中的C點 
bottom: 矩形底部的Y座標 120     ------->圖片中的D點 
說白了就是左上角的座標是(150,75),右下角的座標是(260,120),這樣就好理解了

3.4   drawArc方法解釋

    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

  • oval :指定圓弧的外輪廓矩形區域。
  • startAngle: 圓弧起始角度,單位爲度。
  • sweepAngle: 圓弧掃過的角度,順時針方向,單位爲度。
  • useCenter: 若是爲True時,在繪製圓弧時將圓心包括在內,一般用來繪製扇形。
  • paint: 繪製圓弧的畫板屬性,如顏色,是否填充等。

關於圓弧起始角度的解釋:

@Override  
protected void onDraw(Canvas canvas) {  
    super.onDraw(canvas);  
    canvas.drawArc(mRectF, 0, 90, false, mPaint);  
    mPaint.setColor(Color.RED);  
    canvas.drawArc(mRectF, 90, 90, false, mPaint);  
    mPaint.setColor(Color.YELLOW);  
    canvas.drawArc(mRectF, 180, 90, false, mPaint);  
    mPaint.setColor(Color.GRAY);  
    canvas.drawArc(mRectF, 270, 90, false, mPaint);  
    canvas.drawRect(mRectF,mPaint2);  
}

效果以下圖所示:

關於useCenter經過下面來進行描述:

 

參考地址:

            http://www.cnblogs.com/hwgt/p/5416866.html

            http://blog.csdn.net/rhljiayou/article/details/7212620/

        一、android繪圖Paint.setAnitAlias()和Paint.setDither()方法的做用
            http://blog.csdn.net/lovexieyuan520/article/details/50732023
        二、Android Paint setAntiAlias
            http://blog.csdn.net/shichaosong/article/details/21157751

        三、關於Rect參數解釋的比較好的文章
            http://blog.csdn.net/chengyingzhilian/article/details/7452082

        四、關於drawArc方法解釋參考的文章

            http://blog.sina.com.cn/s/blog_783ede0301012im3.html

            http://blog.csdn.net/senyangs/article/details/44240307

相關文章
相關標籤/搜索