在Android中如何在另一个图像上绘制图像,但只在它们重叠的位置?

时间:2016-06-28 02:29:39

标签: android android-canvas

我有一个包含一个人的png图像,不是一个人的图像区域是透明的。我想在该图像的顶部绘制,但仅限于它不透明的地方。所以,只对这个人。例如,假设我有一个蓝色矩形,我将这个矩形放在这条腿上,那么它应该看起来像是穿着裤子,因为唯一能显示蓝色的是他的腿。

如果在我的片段中我有一个MyImageView并将源设置为png图像我有一个人。然后下面的代码将显示该人物图像。

public class MyImageView extends ImageView {
private HashMap<String, InjuryOverlay> overlays = new HashMap<>();

public MyImageView(Context context) {
    super(context);
}

public MyImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public void addOverlay(String overlayName, MyOverlay overlay) {
    overlays.put(overlayName, overlay);
}

public void removeAllOverlays() {
    overlays.clear();
}

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

    for (MyOverlay overlay : overlays.values()){
        overlay.onDraw(canvas);
    }
}
}

如果我在其显示的路径中添加了一些MyOverlay,在我的情况下为RED,并且它很好地覆盖了我可以在其下看到人类的地方,但我不希望显示任何溢出...只有那些直接接触这个人的部分。

public class MyOverlay
{
    private String name;
    private ArrayList<Point> path;
    private int color;
    private Paint paint = new Paint();
    private Path drawPath = new Path();

public MyOverlay() {
    paint.setStyle(Paint.Style.FILL);
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
}

public MyOverlay(String name, ArrayList<Point> path, int color) {
    this();
    setName(name);
    setPath(path);
    setColor(color);
}

public void setName(String name) {
    this.name = name;
}

public void setPath(ArrayList<Point> path) {
    this.path = path;
}

public void setColor(int color) {
    this.color = color;
    paint.setColor(this.color);
}

public void onDraw(Canvas canvas) {
    if (path != null && path.size() > 1)
    {
        drawPath.reset();

        drawPath.moveTo(path.get(0).x, path.get(0).y);

        for (int i = 1; i < path.size(); i++)
        {
            drawPath.lineTo(path.get(i).x, path.get(i).y);
        }

        // If the path doesn't end on the same point that we stated then force the path to end on the starting
        // point.  This is required since we are filling the path as a solid shape.
        if (path.get(0).x != path.get(path.size()-1).x || path.get(0).y != path.get(path.size()-1).y)
        {
            drawPath.lineTo(path.get(0).x, path.get(0).y);
        }

        canvas.drawPath(drawPath, paint);
    }
}
}

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

我能够通过在上面的代码运行之后应用此问题来回答我自己的问题...所以在我添加了我的叠加后,我运行了以下代码并使用了与原始图像相同的图层蒙版。

Android Mask bitmap on canvas gen a black space