2015-08-09 109 views
0

我试图在画布中绘制圆形位图。如果我想要绘制的画布是透明的,则位图会被正确剪裁,但如果我以前使用不同的颜色绘制矩形,则不会。使用XferMode在画布上绘制圆形位图

enter image description here enter image description here

继承人我得到了什么

paint.setColor(col.colors_Form[1]); 
    mCanvas.drawRect(0, 0, dim.titleContainer_Width, dim.titleContainer_Height, paint); 

    [...] 


    if (!mFormValues_BasicInformation.get(0).getAvatarImage().equals("")) { 

     mCanvas.save(); 

     mCanvas.translate(300, 300); 

     byte[] byteArray = mFormValues_BasicInformation.get(0).getAvatarImage(); 

     Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), 250, 250, false); 

     final int color = col.colors_Form[1]; 
     final Paint avatarPaint = new Paint(); 
     final Rect rect = new Rect(0, 0, bmp.getWidth(), 
       bmp.getHeight()); 

     avatarPaint.setAntiAlias(true); 
     mCanvas.drawARGB(0, 0, 0, 0); 

     avatarPaint.setColor(color); 
     mCanvas.drawCircle(bmp.getWidth()/2, 
       bmp.getHeight()/2, bmp.getWidth()/2, paint); 
     avatarPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     mCanvas.drawBitmap(bmp, rect, rect, avatarPaint); 
     bmp.recycle(); 

     mCanvas.restore(); 
    } 

有谁知道如何解决这个问题? Thx提前! :)

+1

使用'BitmapShader',其最简单的办法... – pskink

+0

OUH那不是很具体: (你能提供一个例子吗? – luQ

+0

问叔叔谷歌,他会回答很多答案 – pskink

回答

1

BitmapShader的伎俩:

 [...] 
     byte[] byteArray = mFormValues_BasicInformation.get(0).getAvatarImage(); 
     Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), 500, 500, false); 

     final Paint avatarPaint = new Paint(); 

     BitmapShader shader = new BitmapShader(bmp, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); 
     avatarPaint.setShader(shader); 
     avatarPaint.setAntiAlias(true); 

     float r = Math.min(bmp.getWidth(), bmp.getHeight())/2f; 
     mCanvas.drawCircle(r, r, r, avatarPaint); 

     bmp.recycle(); 
     [...] 

附加信息:

CircleTranform