這近在圖片圓角的問題上對
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
糾結了很久, 不知道是setXfermode是做什麼用的。後面看了下官方文檔,和查閱了些資料才知道
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 更能非常的強大
可以通過修改Paint的Xfermode來影響在Canvas已有的映像上面繪製新的顏色的方式 。
在正常的情況下,在已有的映像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那麼它將完全遮擋住下面的Paint;如果它是部分透明的,那麼它將會被染上下面的顏色。
下面的Xfermode子類可以改變這種行為:
AvoidXfermode 指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。
PixelXorXfermode 當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。
PorterDuffXfermode 這是一個非常強大的轉換模式,使用它,可以使用映像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas映像進行互動。
要應用轉換模式,可以使用setXferMode方法,如下所示:
AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);
2. 16條Porter-Duff規則 源碼
public class PorterDuff { // these value must match their native equivalents. See SkPorterDuff.h public enum Mode { /** [0, 0] */ CLEAR (0), /** [Sa, Sc] */ SRC (1), /** [Da, Dc] */ DST (2), /** [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */ SRC_OVER (3), /** [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */ DST_OVER (4), /** [Sa * Da, Sc * Da] */ SRC_IN (5), /** [Sa * Da, Sa * Dc] */ DST_IN (6), /** [Sa * (1 - Da), Sc * (1 - Da)] */ SRC_OUT (7), /** [Da * (1 - Sa), Dc * (1 - Sa)] */ DST_OUT (8), /** [Da, Sc * Da + (1 - Sa) * Dc] */ SRC_ATOP (9), /** [Sa, Sa * Dc + Sc * (1 - Da)] */ DST_ATOP (10), /** [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] */ XOR (11), /** [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */ DARKEN (12), /** [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */ LIGHTEN (13), /** [Sa * Da, Sc * Dc] */ MULTIPLY (14), /** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */ SCREEN (15); Mode(int nativeInt) { this.nativeInt = nativeInt; } final int nativeInt; }
自己寫了個方法進行測試,當他們去不同的枚舉時自訂的畫圖顯示是不同的 /** * bitmap 原圖 * roundPx 圓角的度數 * mode PorterDuff 枚舉類型值 */
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx, Mode mode) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_4444); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); //paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); //MULTIPLY 多層陰影 paint.setXfermode(new PorterDuffXfermode(mode)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }
imageView1.setImageBitmap(ImgUtil.getModeBitmap(bt.getBitmap(),Mode.values()[Integer.parseInt(num)]));
前面是原圖,後面是DST_OVER
其餘的大家多試試 就知道是什麼意思了。