PorterDuffXfermode

通過PorterDuffXfermode設置圓角/圓形圖片:

效果圖:

    /**
     * 圓或圓角圖片
     * @param bitmap
     * @param drawcircle 是否繪製圓
     * @return
     */
    public Bitmap  toRoundBitmap(Bitmap bitmap,boolean drawcircle) {
        int width =  bitmap.getWidth();// 獲取圖片的寬度
        int height =  bitmap.getHeight();// 獲取圖片的高度
        int  squareWidth = Math.min(width, height);
        // 正方形的邊長,以寬和高中最小的那個爲參照,截取正方形
        Bitmap backgroundBmp = Bitmap.createBitmap(squareWidth,squareWidth,Config.ARGB_8888);// 構建一個正方形的bitmap
        // 創建一個畫布,用於畫圖
        Canvas canvas = new Canvas(backgroundBmp);
        // 創建一個畫筆
        Paint paint = new Paint();
        paint.setAntiAlias(true); // 設置邊緣光滑,去掉鋸齒
        //取正中間的部分、正方形的左上右下座標
        Rect src = new  Rect(width/2-squareWidth/2,height/2-squareWidth/2, width/2+squareWidth/2,  height/2+squareWidth/2);
        //目標圖片的大小
        RectF dest = new  RectF(0,0, squareWidth, squareWidth);  
        if(drawcircle){
            canvas.drawCircle(squareWidth/2,  squareWidth/2, squareWidth/2, paint);//畫一個圓
        }else{
            canvas.drawRoundRect(dest, 100,100, paint); //畫圓角
        }
        // 設置當兩個圖形相交時的模式,SRC_IN爲取圖形相交的部分,多餘的將被去掉
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, src, dest,  paint); // canvas將bitmap畫在backgroundBmp上     
        return  backgroundBmp; // 返回已經繪畫好的backgroundBmp
    }

PorterDuffXfermode:
效果圖(來自ApiDemos/Graphics/XferModes)

PorterDuff.Mode爲枚舉類,一共有16個枚舉值:

1.PorterDuff.Mode.CLEAR
所繪製不會提交到畫布上。

2.PorterDuff.Mode.SRC
顯示上層繪製圖片

3.PorterDuff.Mode.DST
顯示下層繪製圖片

4.PorterDuff.Mode.SRC_OVER
正常繪製顯示,上下層繪製疊蓋。

5.PorterDuff.Mode.DST_OVER
上下層都顯示。下層居上顯示。

6.PorterDuff.Mode.SRC_IN
取兩層繪製交集。顯示上層。

7.PorterDuff.Mode.DST_IN
取兩層繪製交集。顯示下層。

8.PorterDuff.Mode.SRC_OUT
取上層繪製非交集部分。

9.PorterDuff.Mode.DST_OUT
取下層繪製非交集部分。

10.PorterDuff.Mode.SRC_ATOP
取下層非交集部分與上層交集部分

11.PorterDuff.Mode.DST_ATOP
取上層非交集部分與下層交集部分

12.PorterDuff.Mode.XOR
異或:去除兩圖層交集部分

13.PorterDuff.Mode.DARKEN
取兩圖層全部區域,交集部分顏色加深

14.PorterDuff.Mode.LIGHTEN
取兩圖層全部,點亮交集部分顏色

15.PorterDuff.Mode.MULTIPLY
取兩圖層交集部分疊加後顏色

16.PorterDuff.Mode.SCREEN
取兩圖層全部區域,交集部分變爲透明色

canvas原有的圖片可以理解爲背景,就是dst;新畫上去的圖片可以理解爲前景,就是src

發佈了75 篇原創文章 · 獲贊 38 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章