java - 将 ImageView 作为 mask 应用到另一个 ImageView

标签 java android bitmask

我已经阅读了有关应用 .png 作为 ImageView 蒙版 ( Android how to apply mask on ImageView? ) 的帖子,但我很好奇是否可以在没有 .png 文件的情况下完成此操作。

我有一个占据整个屏幕的 ImageView。我想要的是掩盖它中间的一个正方形。但是我不想使用实际的 .png 文件并将其用作掩码。我想通过制作适当大小的 ImageView 然后使用该 ImageView 作为 mask 来“绘制”正方形。

这可能吗?

最佳答案

你不能只绘制一个圆形渐变而不是png的位图吗?我已经捕获了makeRadGrad你可以将它用作 answer 中的位图您链接:

private Bitmap mImage = ...;
private Bitmap mMask = ...;  // png mask with transparency
private int mPosX = 0;
private int mPosY = 0;

private final Paint maskPaint;
private final Paint imagePaint;

public CustomView (final Context context) {
    maskPaint = new Paint();
    maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

    imagePaint = new Paint();
    imagePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));

    mImage = //set image
    mMask = makeRadGrad(mImage.width()); //we'll just assume you have a perfectly square image

}

/* TODO
if you have more constructors, make sure you initialize maskPaint and imagePaint
Declaring these as final means that all your constructors have to initialize them.
Failure to do so = your code won't compile.
*/

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.save();
    canvas.drawBitmap(mMask, 0, 0, maskPaint);
    canvas.drawBitmap(mImage, mPosX, mPosY, imagePaint);
    canvas.restore();
}

private Bitmap makeRadGrad(int size) {
    int radius = (int) (size/2f);
    RadialGradient gradient = new RadialGradient(radius, radius, radius, 0xFF00FF00,
        0x00000000, android.graphics.Shader.TileMode.CLAMP);
    Paint p = new Paint();
    p.setDither(true);
    p.setShader(gradient);

    Bitmap bitmap = Bitmap.createBitmap(size, size, Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    c.drawCircle(radius, radius, radius, p);

    return bitmap;
}

关于java - 将 ImageView 作为 mask 应用到另一个 ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30442335/

相关文章:

java - 关于android中controltransfer设置USB通信的说明

javascript - 用于测试元素是否包含在有限集中的位掩码解决方案?

使用枚举类的 C++11 标准符合位掩码

java - 在 JavaFX 中调整窗口大小时如何调整图像大小

java - 将目录和文件从 res/raw 文件夹复制到 SD 卡 - android

android - 如何在 RecyclerView.Adapter 中使用 ViewBinding?

c# - 如何将位掩码值转换为选项对象?

java - 修复了保持数据正确组织而不重复的问题

java - 将文本字段值转换为字符数组

android - 使用 GSON 将变化的字段名映射到 POJO