package com.tekinarslan.material.sample.customui.XferModeDemo; import android.content.Context; import android.graphics.AvoidXfermode; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import com.tekinarslan.material.sample.R; public class AvoidXfermodeView extends View { private Paint mBitmapPaint, mAvoidPaint; private int mTotalWidth, mTotalHeight; private Bitmap mBitmap; private int mBitWidth, mBitHeight; private Rect mOriginSrcRect, mOriginDestRect; private Rect mAvoidSrcRect, mAvoidDestRect; private AvoidXfermode mAvoidXfermode; public AvoidXfermodeView(Context context) { super(context); initPaint(); initBitmap(); // 对蓝色相近的颜色进行替换 mAvoidXfermode = new AvoidXfermode(Color.BLUE, 150, AvoidXfermode.Mode.TARGET); } public AvoidXfermodeView(Context context, AttributeSet attrs) { super(context,attrs); initPaint(); initBitmap(); // 对蓝色相近的颜色进行替换 mAvoidXfermode = new AvoidXfermode(Color.BLUE, 150, AvoidXfermode.Mode.TARGET); } private void initBitmap() { mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.bluelogo)).getBitmap(); mBitWidth = mBitmap.getWidth(); mBitHeight = mBitmap.getHeight(); } private void initPaint() { mBitmapPaint = new Paint(); // 去锯齿 mBitmapPaint.setAntiAlias(true); // 防抖动 mBitmapPaint.setDither(true); // 图像过滤 mBitmapPaint.setFilterBitmap(true); // 使用上面属性创建一个新paint mAvoidPaint = new Paint(mBitmapPaint); // 颜色设置为红色 mAvoidPaint.setColor(Color.RED); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制原图 canvas.drawBitmap(mBitmap, mOriginSrcRect, mOriginDestRect, mBitmapPaint); // 绘制用于变色图 canvas.drawBitmap(mBitmap, mAvoidSrcRect, mAvoidDestRect, mAvoidPaint); // 设置图层混合模式 mAvoidPaint.setXfermode(mAvoidXfermode); // 绘制色块进行混合,得到最终效果 canvas.drawRect(mAvoidDestRect, mAvoidPaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mTotalWidth = w; mTotalHeight = h; mOriginSrcRect = new Rect(0, 0, mBitWidth, mBitHeight); // 为了让图水平居中 int left = (mTotalWidth - mBitWidth) / 2; mOriginDestRect = new Rect(left, 0, left + mBitWidth, mBitHeight); mAvoidSrcRect = new Rect(mOriginSrcRect); // 两张图得间距 int distance = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics()); mAvoidDestRect = new Rect(left, mBitHeight + distance, left + mBitWidth, mBitHeight * 2 + distance); } }