效果如下:

理解:Xfermode的16总模式如图

第一步:
1package com.rong.activity; 2 3import com.rong.test.R; 4 5import android.content.Context; 6import android.graphics.Bitmap; 7import android.graphics.BitmapFactory; 8import android.graphics.Canvas; 9import android.graphics.Color; 10import android.graphics.Paint; 11import android.graphics.PorterDuff.Mode; 12import android.graphics.PorterDuffXfermode; 13import android.graphics.Rect; 14import android.graphics.RectF; 15import android.util.AttributeSet; 16import android.view.View; 17/** 18 * 改变图片颜色的自定义View 19 * @author 徐荣 20 * 21 */ 22public class ChangeImageColorView extends View { 23 Paint mPaint; 24 PorterDuffXfermode xfermode; 25 Bitmap bitmap; 26 int mBitWidth; 27 int mBitHeight; 28 int width; 29 int height; 30 Rect srcRect; 31 Rect dstRect; 32 RectF mRect; 33 int i=0; 34 35 public ChangeImageColorView(Context context, AttributeSet attrs) { 36 super(context, attrs); 37 initView(); 38 } 39 40 private void initView() { 41 // 初始化画笔 42 mPaint = new Paint(); 43 mPaint.setAntiAlias(true); 44 mPaint.setColor(Color.BLUE); 45 // 设置Xfermode 46 xfermode = new PorterDuffXfermode(Mode.SRC_IN); 47 // 获取图片源 48 bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.robot); 49 mBitWidth = bitmap.getWidth(); 50 mBitHeight = bitmap.getHeight(); 51 52 } 53 54 @Override 55 protected void onSizeChanged(int w, int h, int oldw, int oldh) { 56 super.onSizeChanged(w, h, oldw, oldh); 57 //获取控件的宽高 58 width = w; 59 height = h; 60 srcRect = new Rect(0, 0, width, height); 61 dstRect = new Rect(0, 0, width, height); 62 mRect = new RectF(0, 0, width, height); 63 i=width; 64 } 65 66 @Override 67 protected void onDraw(Canvas canvas) { 68 super.onDraw(canvas); 69 //相当于PS的新建图层 70 int num = canvas.saveLayer(0, 0, width, height, mPaint, Canvas.ALL_SAVE_FLAG); 71 //绘制图片 72 canvas.drawBitmap(bitmap, srcRect, dstRect, mPaint); 73 //设置图片混合模式 74 mPaint.setXfermode(xfermode); 75 //绘制动态区域 76 canvas.drawRect(mRect, mPaint); 77 //恢复混合模式 78 mPaint.setXfermode(null); 79 //合并图层 80 canvas.restoreToCount(num); 81 //更改区域的位置 82 i = i - 1; 83 mRect.top = i; 84 if (i == 0) { 85 i = width; 86 } 87 //刷新UI,他会调用onDraw方法 88 invalidate(); 89 } 90 91}
第二步
1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/main_touchlayout" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:background="#ffffff" 7 android:orientation="vertical" > 8 9 <com.rong.activity.ChangeImageColorView 10 android:id="@+id/main_percentview" 11 android:layout_width="100dp" 12 android:layout_height="100dp" 13 android:layout_centerInParent="true" /> 14 15</RelativeLayout>
Run