Android 如何将两个图像视图(一个放在另一个上)混合在一起? 背景

Android 如何将两个图像视图(一个放在另一个上)混合在一起? 背景,android,android-imageview,blending,Android,Android Imageview,Blending,我有两个图像视图,一个在另一个之上,它们一起有一个动画。我需要他们相互混合,使用“倍增”效果,在这个动画 与之类似的是关于颜色,但图像(在我的例子中是矢量绘制的,但如果需要,我可以使用PNG) 这里有一个草图来演示我想做什么: 请注意,重叠的图像部分比箭头的原始颜色更暗 问题 到目前为止,我还没有找到一个办法。我当然知道如何将一个视图置于另一个视图之上,但基于另一个视图更改位图部分的颜色是我找不到的 我发现了什么 我尝试使用: imageView.getDrawable().setColorF

我有两个图像视图,一个在另一个之上,它们一起有一个动画。我需要他们相互混合,使用“倍增”效果,在这个动画

与之类似的是关于颜色,但图像(在我的例子中是矢量绘制的,但如果需要,我可以使用PNG)

这里有一个草图来演示我想做什么:

请注意,重叠的图像部分比箭头的原始颜色更暗

问题 到目前为止,我还没有找到一个办法。我当然知道如何将一个视图置于另一个视图之上,但基于另一个视图更改位图部分的颜色是我找不到的

我发现了什么 我尝试使用:

imageView.getDrawable().setColorFilter(..., PorterDuff.Mode.MULTIPLY)
对于两个ImageView,但它似乎都不起作用。它所做的实际上是改变imageView的整个颜色,与我提供的作为参数的颜色合并

这是有道理的,因为它只是一个颜色过滤器,类似于色调

我还为每个ImageView尝试了alpha,但这也意味着ImageView的一部分(不重叠的部分)将具有半透明颜色

理论上,我可以得到它们中每一个的位图,然后对结果执行过滤,但这并不实际,因为我需要在两者之间的动画中显示它

问题
如何混合这两个图像视图?

既然您使用的是VectorDrawable,您是否考虑过为drawable而不是视图设置动画

试试这个:

public Bitmap combineImages(Bitmap frame, Bitmap image) {

            Bitmap cs = null;
            Bitmap rs = null;

            rs = Bitmap.createScaledBitmap(frame, image.getWidth(),
                    image.getHeight(), true);

            cs = Bitmap.createBitmap(rs.getWidth(), rs.getHeight(),
                    Bitmap.Config.RGB_565);

            Canvas comboImage = new Canvas(cs);

            comboImage.drawBitmap(image, 0, 0, null);
            comboImage.drawBitmap(rs, 0, 0, null);

            if (rs != null) {
                rs.recycle();
                rs = null;
            }
            Runtime.getRuntime().gc();

            return cs;
        }

好的,似乎不可能使用2个视图,因为它们在Android上的工作方式,因此,我想展示如何使用LayerDrawable:

public class LD extends LayerDrawable {
    private Paint p = new Paint();

    public LD(Drawable[] layers) {
        super(layers);
        p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        int count = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);

        for (int i = 0, numberOfLayers = getNumberOfLayers(); i < numberOfLayers; ++i) {
            this.getDrawable(i).draw(canvas);
            canvas.saveLayer(null, p, Canvas.ALL_SAVE_FLAG);
        }
        canvas.restoreToCount(count);

        //original code:
        //int count = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
        //this.getDrawable(0).draw(canvas);
        //canvas.saveLayer(null, p, Canvas.ALL_SAVE_FLAG);
        //this.getDrawable(1).draw(canvas);
        //canvas.restoreToCount(count);
    }
}

这是我们实际考虑的一个选项(我在这里写过),但是我们需要研究这两个选项。请避免写使用完全不同的API的答案。@pskink我该怎么做?此外,扩展ImageView(或其支持库视图)是否会破坏对使用VectorDrawable的支持?那么按像素改变颜色呢?@AbidKhan已经在问题中写到了这一点。它不会工作,因为我不想改变视图的整个颜色,只想改变重叠部分。可以扩展视图并使用画布绘制两幅图像吗?一旦达到所需的重叠效果,放置动画师并不困难。您所展示的@Ankit示例类似于Alpha。我不要阿尔法。我希望图像视图的真实颜色相互混合。正如我所写的,我不想使用位图,因为这需要我对动画的每一帧都使用位图。这将需要大量的CPU使用。
    ImageView imageView = (ImageView) findViewById(R.id.imageView);
    Drawable drawable1 = AppCompatResources.getDrawable(this, R.drawable....);
    Drawable drawable2 = AppCompatResources.getDrawable(this, R.drawable....);
    Drawable drawable3 = AppCompatResources.getDrawable(this, R.drawable....);

    LD layerDrawable = new LD(new Drawable[]{
            drawable1,
            drawable2,
            drawable3
    });
    imageView.setImageDrawable(layerDrawable);