天天看點

自定義控件學習之canvas和paint相關知識點學習

1,繼承自view,實作ondraw方法:

    初始化畫筆,TextPaint paint,并設定畫筆屬性:

      paint.setFlags(Paint.ANTI_ALIAS_FLAG):畫筆抗鋸齒。

      paint.setStyle(Paint.Style.STROKE):設定畫筆樣式,預設全部填充Full

        {  1.Paint.Style.STROKE:描邊;

            2.Paint.Style.FILL_AND_STROKE:描邊并填充

            3.Paint.Style.FILL:填充

        }

     paint.setStrokeCap(Paint.Cap.ROUND):畫筆樣式為STROKE或FILL_OR_STROKE時,設定筆刷的圖形樣式

       {   1,圓形樣式    Cap.ROUND,

           2,方形樣式  Cap.SQUARE 

       }

     paint.setColor(0xff00ff00):設定畫筆顔色

     Canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint):利用TextPaint在canvas上繪制線條:坐标從(startX,startY)到(stopX,stopY),坐标點起點為左上角,起點為0,0

2,在xml布局裡面設定自定義布局控件

 背景顔色繪制:

  canvas.drawARGB(a, r, g, b):其中a,r,g,b為0到255的int值,用來組成畫布的背景顔色

  canvas.drawColor(Color.BLUE) :将會以顔色ARBG填充整個控件的Canvas背景

  canvas.drawColor(Color.BLUE, Mode.SCREEN) :繪制顔色,但是要制定一個mode

    mode參數:

    

自定義控件學習之canvas和paint相關知識點學習

    對應下圖:

自定義控件學習之canvas和paint相關知識點學習

    對應如下規則:

       SRC :隻繪制源圖像

       DST :隻繪制目标圖像 

       DST_OVER :在源圖像的頂部繪制目标圖像 

       DST_IN :隻在源圖像和目标圖像相交的地方繪制目标圖像 

       DST_OUT :隻在源圖像和目标圖像不相交的地方繪制目标圖像 

       DST_ATOP :在源圖像和目标圖像相交的地方繪制目标圖像,在不相交的地方繪制源圖像 

       SRC_OVER :在目标圖像的頂部繪制源圖像 

       SRC_IN :隻在源圖像和目标圖像相交的地方繪制源圖像 

       SRC_OUT :隻在源圖像和目标圖像不相交的地方繪制源圖像 

       SRC_ATOP :在源圖像和目标圖像相交的地方繪制源圖像,在不相交的地方繪制目标圖像 

       XOR :在源圖像和目标圖像重疊之外的任何地方繪制他們,而在不重疊的地方不繪制任何内容 

      LIGHTEN :獲得每個位置上兩幅圖像中最亮的像素并顯示 

       DARKEN :獲得每個位置上兩幅圖像中最暗的像素并顯示

      MULTIPLY :将每個位置的兩個像素相乘,除以255,然後使用該值建立一個新的像素進行顯示。結果顔色=頂部顔色*底部顔色/255 

       SCREEN :反轉每個顔色,執行相同的操作(将他們相乘并除以255),然後再次反轉。結果顔色=255-(((255-頂部顔色)*(255-底部顔色))/255) 

 如上代碼ondraw裡面代碼:

效果:

自定義控件學習之canvas和paint相關知識點學習
自定義控件學習之canvas和paint相關知識點學習
自定義控件學習之canvas和paint相關知識點學習

效果如下:

自定義控件學習之canvas和paint相關知識點學習

 效果:

自定義控件學習之canvas和paint相關知識點學習
自定義控件學習之canvas和paint相關知識點學習

擦,還有這種:

自定義控件學習之canvas和paint相關知識點學習

如上三種方法來進行繪制方塊:

canvas.drawcircle為繪制圓

自定義控件學習之canvas和paint相關知識點學習

 繪制圓,style有三種:

自定義控件學習之canvas和paint相關知識點學習

代碼試試,看看效果:

填充,填充輪廓和裡面

Fill或者Fill_AND_STROKE:

效果如上圖:

設定為:

Stoke,繪制輪廓

paint.setStyle(Style.STROKE);

自定義控件學習之canvas和paint相關知識點學習

 雖然調用的是drawoval,其實還是主要通過RectF和上下左右的位置的計算來進行控制

paint.setStyle(Style.STROKE)為圖2

自定義控件學習之canvas和paint相關知識點學習
自定義控件學習之canvas和paint相關知識點學習

BitmpaUtils.drawableToBitmap方法代碼,将drawable轉換為bitmap:

執行效果:

自定義控件學習之canvas和paint相關知識點學習

縮放借助Matrix來實作:

看下效果,寬高縮小一半:

自定義控件學習之canvas和paint相關知識點學習

對圖檔進行旋轉:

matrix.postRotate(45);

自定義控件學習之canvas和paint相關知識點學習

繼續閱讀