所以我从这里尝试了代码:用掩码创建一个ImageView.我使用以下图像作为原始和掩码:


但是,我得到的结果是这样的:

请注意,窗口背景不是黑色,而是全息光(在星系连接上看起来像一个非常浅的灰色,而不是完全白色).第二个图像是在列表视图中选择项目时得到的结果.
相反,如果我使用相同的算法创建一个新的位图,然后将其传递给图像视图而不是覆盖onDraw(),它会正确绘制:
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果:

请注意,正确应用了淡入淡出.选择时,这一点更为明显.
那么ImageView的onDraw方法是如何创建这个黑色背景而不是让窗口背景显示的呢?有趣的是,如果原始图像本身具有一定的透明度,则该透明度得到尊重,例如:

我自己无法弄明白.我宁愿能够在onDraw上进行,而不是预先创建位图,因为它只适用于位图作为源和掩码.我希望能够使用其他可绘制的内容,如渐变和纯色,但在这些情况下,宽度和高度未设置.
我尝试使用Porter-Duff Xfermodes在我的Android应用程序中擦除部分位图.
我有一个绿色背景,由蓝色位图覆盖.当我触摸屏幕时,应该创建覆盖位图中的"洞",使绿色背景可见.而不是一个洞,我当前的代码产生一个黑点.
以下是我的代码.任何想法,我在这里做错了什么?
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new DrawView(this));
}
public class DrawView extends View implements OnTouchListener {
private int x = 0;
private int y = 0;
Bitmap bitmap;
Canvas bitmapCanvas;
private final Paint paint = new Paint();
private final Paint eraserPaint = new Paint();
public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
// Set background
this.setBackgroundColor(Color.GREEN);
// Set bitmap
bitmap = Bitmap.createBitmap(320, 480, …Run Code Online (Sandbox Code Playgroud) 我尝试为CSS中的按钮创建悬停效果.

基本上,文本应该被"剪掉"其父元素,使其透视到网站背景.
我会用渐变做条纹,但我的问题是为字体添加透明度.
我查看了背景剪辑,但这与我试图实现的相反,并且会使事情变得更复杂.有没有一种简单的方法来实现这种效果?我不介意使用JS,但如果可能的话没有jQuery.