我有一个包含位图的图像视图。此位图具有Alpha通道和透明像素。
当我尝试将colorfiter与mode.overlay(自Honeycomb以来)一起使用时,提供的颜色覆盖整个图像视图(整个矩形),但我只想覆盖非透明像素。如何剪辑imageview的画布以在需要的位置执行筛选?
更新的
我有PNG的灰色图像:
当我尝试使用上面的模式时,我得到:
当我使用覆盖时,我得到:
我想得到的是:

最佳答案

可能有一种更有效的方法来实现这一点(可能是通过创建一个ColorMatrixColorFilter来近似它),但是由于Mode.OVERLAY看起来是hard to simplify otherwise,这里有一些示例代码应该实现您想要的:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final ImageView imageView = new ImageView(this);
        setContentView(imageView);

        final Paint paint = new Paint();
        Canvas c;

        final Bitmap src = BitmapFactory.decodeResource(getResources(),
                android.R.drawable.sym_def_app_icon);
        final int overlayColor = Color.RED;

        final Bitmap bm1 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
        c = new Canvas(bm1);
        paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.OVERLAY));
        c.drawBitmap(src, 0, 0, paint);

        final Bitmap bm2 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
        c = new Canvas(bm2);
        paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.SRC_ATOP));
        c.drawBitmap(src, 0, 0, paint);

        paint.setColorFilter(null);
        paint.setXfermode(new AvoidXfermode(overlayColor, 0, Mode.TARGET));
        c.drawBitmap(bm1, 0, 0, paint);

        imageView.setImageBitmap(bm2);
    }

}

简而言之,我们使用OVERLAY模式绘制源位图和颜色,然后使用辅助位图(使用SRC_ATOP模式合成),使用AvoidXfermode组合它以不绘制透明像素。
原始图像:
结果:

08-04 01:12