Android中將方形圖片擷取成圓形的兩種實現方式

有一點e發表於2016-01-28

以下兩種方法均有不足,僅供參考

第一種實現方式是通過設定畫筆的渲染方式對圖片進行處理:

首先要了解幾種渲染方式
Shader的幾個子類
1.BitmapShader(影像渲染)
  BitmapShader的作用是使用一張點陣圖作為紋理來對某一區域進行填充。可以想象成在一塊區域內鋪瓷磚,只是這裡的瓷磚是一張張點陣圖而已。
  
2.LinearGradient(線性渲染)
  LinearGradient的作用是實現某一區域內顏色的線性漸變效果。
  
3.ComposeShader(混合渲染)
  ComposeShader的作用是實現渲染效果的疊加,如BitmapShader與LinearGradient的混合渲染效果等。

4.RadialGradient(環形渲染)
  RadialGradient的作用是在某一區域內實現環形的漸變效果。
  
5.SweepGradient(梯度渲染)
  SweepGradient也稱為掃描渲染,是指在某一中心以x軸正方向逆時針旋轉一週而形成的掃描效果的渲染形式。

    public Bitmap drawCircleView01(Bitmap bitmap) {
        //這裡可能需要調整一下圖片的大小來讓你的圖片能在圓裡面充分顯示
        bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
        //構建一個點陣圖物件,畫布繪製出來的圖片將會繪製到此bitmap物件上
        Bitmap bm = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
        //構建一個畫布,
        Canvas canvas = new Canvas(bm);
        //獲得一個畫筆物件,並設定為抗鋸齒
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //獲得一種渲染方式物件
        //BitmapShader的作用是使用一張點陣圖作為紋理來對某一區域進行填充。
        //可以想象成在一塊區域內鋪瓷磚,只是這裡的瓷磚是一張張點陣圖而已。
        Shader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        //設定畫筆的渲染方式
        paint.setShader(shader);
        //通過畫布的畫圓方法將渲染後的圖片繪製出來
        canvas.drawCircle(100, 100, 100, paint);
        //返回的就是一個圓形的bitmap物件
        return bm;
    }

第二種方法是通過繪製出兩個圖形,然後在他們的交集區域顯示需要裁剪的圖片:

Porter-Duff 效果圖

    public Bitmap drawCircleView02(Bitmap bitmap){

        //前面同上,繪製影像分別需要bitmap,canvas,paint物件
        bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
        Bitmap bm = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //這裡需要先畫出一個圓
        canvas.drawCircle(100, 100, 100, paint);
        //圓畫好之後將畫筆重置一下
        paint.reset();
        //設定影像合成模式,該模式為只在源影像和目標影像相交的地方繪製源影像 
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, 0, 0, paint);
        return bm;
    }

附上最後繪製出來的效果圖:
效果圖

相關文章