免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

8.3.1 三個(gè)繪圖工具類詳解

 小飛苑 2017-01-04

本節(jié)引言:

上兩小節(jié)我們學(xué)習(xí)了Drawable以及Bitmap,都是加載好圖片的,而本節(jié)我們要學(xué)習(xí)的繪圖相關(guān)的 一些API,他們分別是Canvas(畫布),Paint(畫筆),Path(路徑)!本節(jié)非常重要,同時(shí)也是我們 自定義View的基礎(chǔ)哦~好的,話不多說開始本節(jié)內(nèi)容~

官方API文檔:Canvas;Paint;Path;


1.相關(guān)方法詳解


1)Paint(畫筆):

就是畫筆,用于設(shè)置繪制風(fēng)格,如:線寬(筆觸粗細(xì)),顏色,透明度和填充風(fēng)格等 直接使用無參構(gòu)造方法就可以創(chuàng)建Paint實(shí)例: Paint paint = new Paint( );

我們可以通過下述方法來設(shè)置Paint(畫筆)的相關(guān)屬性,另外,關(guān)于這個(gè)屬性有兩種, 圖形繪制相關(guān)與文本繪制相關(guān):

  • setARGB(int a,int r,int g,int b): 設(shè)置繪制的顏色,a代表透明度,r,g,b代表顏色值。
  • setAlpha(int a): 設(shè)置繪制圖形的透明度。
  • setColor(int color): 設(shè)置繪制的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。
  • setAntiAlias(boolean aa): 設(shè)置是否使用抗鋸齒功能,會(huì)消耗較大資源,繪制圖形速度會(huì)變慢。
  • setDither(boolean dither): 設(shè)定是否使用圖像抖動(dòng)處理,會(huì)使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰
  • setFilterBitmap(boolean filter): 如果該項(xiàng)設(shè)置為true,則圖像在動(dòng)畫進(jìn)行中會(huì)濾掉對Bitmap圖像的優(yōu)化操作, 加快顯示速度,本設(shè)置項(xiàng)依賴于dither和xfermode的設(shè)置
  • setMaskFilter(MaskFilter maskfilter): 設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等
  • setColorFilter(ColorFilter colorfilter): 設(shè)置顏色過濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果
  • setPathEffect(PathEffect effect) 設(shè)置繪制路徑的效果,如點(diǎn)畫線等
  • setShader(Shader shader): 設(shè)置圖像效果,使用Shader可以繪制出各種漸變效果
  • setShadowLayer(float radius ,float dx,float dy,int color):在圖形下面設(shè)置陰影層,產(chǎn)生陰影效果, radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色
  • setStyle(Paint.Style style): 設(shè)置畫筆的樣式,為FILL,F(xiàn)ILL_OR_STROKE,或STROKE
  • setStrokeCap(Paint.Cap cap): 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的圖形樣式, 如圓形樣Cap.ROUND,或方形樣式Cap.SQUARE
  • setSrokeJoin(Paint.Join join): 設(shè)置繪制時(shí)各圖形的結(jié)合方式,如平滑效果等
  • setStrokeWidth(float width): 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的粗細(xì)度
  • setXfermode(Xfermode xfermode): 設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來制作橡皮的擦除效果
  • setFakeBoldText(boolean fakeBoldText): 模擬實(shí)現(xiàn)粗體文字,設(shè)置在小字體上效果會(huì)非常差
  • setSubpixelText(boolean subpixelText): 設(shè)置該項(xiàng)為true,將有助于文本在LCD屏幕上的顯示效果
  • setTextAlign(Paint.Align align): 設(shè)置繪制文字的對齊方向
  • setTextScaleX(float scaleX): 設(shè)置繪制文字x軸的縮放比例,可以實(shí)現(xiàn)文字的拉伸的效果
  • setTextSize(float textSize): 設(shè)置繪制文字的字號(hào)大小
  • setTextSkewX(float skewX): 設(shè)置斜體文字,skewX為傾斜弧度
  • setTypeface(Typeface typeface): 設(shè)置Typeface對象,即字體風(fēng)格,包括粗體,斜體以及襯線體,非襯線體等
  • setUnderlineText(boolean underlineText): 設(shè)置帶有下劃線的文字效果
  • setStrikeThruText(boolean strikeThruText): 設(shè)置帶有刪除線的效果
  • setStrokeJoin(Paint.Join join): 設(shè)置結(jié)合處的樣子,Miter:結(jié)合處為銳角, Round:結(jié)合處為圓?。築EVEL:結(jié)合處為直線
  • setStrokeMiter(float miter):設(shè)置畫筆傾斜度
  • setStrokeCap (Paint.Cap cap):設(shè)置轉(zhuǎn)彎處的風(fēng)格 其他常用方法:
  • float ascent( ):測量baseline之上至字符最高處的距離
  • float descent():baseline之下至字符最低處的距離
  • int breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth): 檢測一行顯示多少文字
  • clearShadowLayer( ):清除陰影層 其他的自行查閱文檔~

2)Canvas(畫布):

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

首先是構(gòu)造方法,Canvas的構(gòu)造方法有兩種:

Canvas(): 創(chuàng)建一個(gè)空的畫布,可以使用setBitmap()方法來設(shè)置繪制具體的畫布。

Canvas(Bitmap bitmap): 以bitmap對象創(chuàng)建一個(gè)畫布,將內(nèi)容都繪制在bitmap上,因此bitmap不得為null。

接著是 1.drawXXX()方法族:以一定的坐標(biāo)值在當(dāng)前畫圖區(qū)域畫圖,另外圖層會(huì)疊加, 即后面繪畫的圖層會(huì)覆蓋前面繪畫的圖層。 比如:

  • drawRect(RectF rect, Paint paint) :繪制區(qū)域,參數(shù)一為RectF一個(gè)區(qū)域
  • drawPath(Path path, Paint paint) :繪制一個(gè)路徑,參數(shù)一為Path路徑對象
  • drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) : 貼圖,參數(shù)一就是我們常規(guī)的Bitmap對象,參數(shù)二是源區(qū)域(這里是bitmap), 參數(shù)三是目標(biāo)區(qū)域(應(yīng)該在canvas的位置和大小),參數(shù)四是Paint畫刷對象, 因?yàn)橛玫搅丝s放和拉伸的可能,當(dāng)原始Rect不等于目標(biāo)Rect時(shí)性能將會(huì)有大幅損失。
  • drawLine(float startX, float startY, float stopX, float stopY, Paintpaint) : 畫線,參數(shù)一起始點(diǎn)的x軸位置,參數(shù)二起始點(diǎn)的y軸位置,參數(shù)三終點(diǎn)的x軸水平位置, 參數(shù)四y軸垂直位置,最后一個(gè)參數(shù)為Paint 畫刷對象。
  • drawPoint(float x, float y, Paint paint): 畫點(diǎn),參數(shù)一水平x軸,參數(shù)二垂直y軸,第三個(gè)參數(shù)為Paint對象。
  • drawText(String text, float x, floaty, Paint paint) : 渲染文本,Canvas類除了上面的還可以描繪文字,參數(shù)一是String類型的文本, 參數(shù)二x軸,參數(shù)三y軸,參數(shù)四是Paint對象。
  • drawOval(RectF oval, Paint paint):畫橢圓,參數(shù)一是掃描區(qū)域,參數(shù)二為paint對象;
  • drawCircle(float cx, float cy, float radius,Paint paint): 繪制圓,參數(shù)一是中心點(diǎn)的x軸,參數(shù)二是中心點(diǎn)的y軸,參數(shù)三是半徑,參數(shù)四是paint對象;
  • drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint): 畫弧,參數(shù)一是RectF對象,一個(gè)矩形區(qū)域橢圓形的界限用于定義在形狀、大小、電弧,參數(shù)二是起始角 (度)在電弧的開始,參數(shù)三掃描角(度)開始順時(shí)針測量的,參數(shù)四是如果這是真的話,包括橢圓中心的電 弧,并關(guān)閉它,如果它是假這將是一個(gè)弧線,參數(shù)五是Paint對象;

2.clipXXX()方法族:在當(dāng)前的畫圖區(qū)域裁剪(clip)出一個(gè)新的畫圖區(qū)域,這個(gè)畫圖區(qū)域就是canvas 對象的當(dāng)前畫圖區(qū)域了。比如:clipRect(new Rect()),那么該矩形區(qū)域就是canvas的當(dāng)前畫圖區(qū)域

3.save()restore()方法: save( ):用來保存Canvas的狀態(tài)。save之后,可以調(diào)用Canvas的平移、放縮、旋轉(zhuǎn)、錯(cuò)切、裁剪等操作! restore():用來恢復(fù)Canvas之前保存的狀態(tài)。防止save后對Canvas執(zhí)行的操作對后續(xù)的繪制有影響。 save()和restore()要配對使用(restore可以比save少,但不能多),若restore調(diào)用次數(shù)比save多,會(huì)報(bào)錯(cuò)!

4.translate(float dx, float dy): 平移,將畫布的坐標(biāo)原點(diǎn)向左右方向移動(dòng)x,向上下方向移動(dòng)y.canvas的默認(rèn)位置是在(0,0)

5.scale(float sx, float sy):擴(kuò)大,x為水平方向的放大倍數(shù),y為豎直方向的放大倍數(shù)

6.rotate(float degrees):旋轉(zhuǎn),angle指旋轉(zhuǎn)的角度,順時(shí)針旋轉(zhuǎn)


3)Path(路徑)

簡單點(diǎn)說就是描點(diǎn),連線~在創(chuàng)建好我們的Path路徑后,可以調(diào)用Canvas的drawPath(path,paint) 將圖形繪制出來~常用方法如下:

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

更高級(jí)的效果可以使用PathEffect類!

幾個(gè)To:

  • moveTo(float x, float y):不會(huì)進(jìn)行繪制,只用于移動(dòng)移動(dòng)畫筆
  • lineTo(float x, float y):用于直線繪制,默認(rèn)從(0,0)開始繪制,用moveTo移動(dòng)! 比如 mPath.lineTo(300, 300); canvas.drawPath(mPath, mPaint);
  • quadTo(float x1, float y1, float x2, float y2): 用于繪制圓滑曲線,即貝塞爾曲線,同樣可以結(jié)合moveTo使用!
  • rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 同樣是用來實(shí)現(xiàn)貝塞爾曲線的。 (x1,y1) 為控制點(diǎn),(x2,y2)為控制點(diǎn),(x3,y3) 為結(jié)束點(diǎn)。 Same as cubicTo, but the coordinates are considered relative to the current point on this contour.就是多一個(gè)控制點(diǎn)而已~ 繪制上述的曲線: mPath.moveTo(100, 500); mPath.cubicTo(100, 500, 300, 100, 600, 500); 如果不加上面的那個(gè)moveTo的話:則以(0,0)為起點(diǎn),(100,500)和(300,100)為控制點(diǎn)繪制貝塞爾曲線
  • arcTo(RectF oval, float startAngle, float sweepAngle): 繪制弧線(實(shí)際是截取圓或橢圓的一部分)ovalRectF為橢圓的矩形,startAngle 為開始角度, sweepAngle 為結(jié)束角度。

2.動(dòng)手試試:

屬性那么多,肯定要手把手的擼一下,才能加深我們的映像是吧~ 嘿嘿,畫圖要么在View上畫,要么在SurfaceView上畫,這里我們在View上畫吧, 我們定義一個(gè)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);  //畫筆風(fēng)格
        mPaint.setTextSize(36);             //繪制文字大小,單位px
        mPaint.setStrokeWidth(5);           //畫筆粗細(xì)
    }
    
    //重寫該方法,在這里繪圖
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
    
} 

然后布局那里設(shè)置下這個(gè)View就好,下述代碼都寫在onDrawable中~


1)設(shè)置畫布顏色:

canvas.drawColor(getResources().getColor(R.color.yellow));   //設(shè)置畫布背景顏色

2)繪制圓形:

canvas.drawCircle(200, 200, 100, mPaint);           //畫實(shí)心圓


3)繪制矩形:

canvas.drawRect(0, 0, 200, 100, mPaint);            //畫矩形


4)繪制Bitmap:

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher), 0, 0, mPaint);


5)繪制弧形區(qū)域:

canvas.drawArc(new RectF(0, 0, 100, 100),0,90,true,mPaint);  //繪制弧形區(qū)域

假如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); //移動(dòng)到 坐標(biāo)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)繪制自定義的圖形:

代碼來源于網(wǎng)上:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.translate(canvas.getWidth()/2, 200); //將位置移動(dòng)畫紙的坐標(biāo)點(diǎn):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; //總刻度數(shù)

    for(int i=0 ; i <count ; i++){
        if(i%5 == 0){
            canvas.drawLine(0f, y, 0, y+12f, mPaint);
            canvas.drawText(String.valueOf(i/5+1), -4f, y+25f, tmpPaint);

        }else{
            canvas.drawLine(0f, y, 0f, y +5f, tmpPaint);
        }
        canvas.rotate(360/count,0f,0f); //旋轉(zhuǎn)畫紙
    }

    //繪制指針
    tmpPaint.setColor(Color.GRAY);
    tmpPaint.setStrokeWidth(4);
    canvas.drawCircle(0, 0, 7, tmpPaint);
    tmpPaint.setStyle(Paint.Style.FILL);
    tmpPaint.setColor(Color.YELLOW);
    canvas.drawCircle(0, 0, 5, tmpPaint);
    canvas.drawLine(0, 10, 0, -65, mPaint);
}


本節(jié)小結(jié):

本節(jié)我們對android.graphics接口類下的三個(gè)繪圖API:Canvas(畫布),Paint(畫筆),Path(路徑)進(jìn)行 了學(xué)習(xí),方法有很多,別去死記,用到的時(shí)候查就好,這里我們先有個(gè)大概映像即可,自定義控件那里 我們再來慢慢糾結(jié)~好的,就說這么多,謝謝~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多