如何将2个图像视图,一个放在另一个上面,将它们混合在一起?

时间:2017-04-04 13:13:06

标签: android android-imageview blending

背景

我有2个imageView,一个在另一个上面,一起有动画。我需要它们相互融合,使用" Multiply"效果,在这个动画中。

this question类似的颜色,但是有图像(在我的情况下是VectorDrawable,但如果需要我可以使用PNG)。

这是一张草图,用以展示我想做的事情:

enter image description here

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

问题

到目前为止,我无法找到办法。我当然知道如何将视图放在另一个视图的顶部,但是基于另一个视图改变位图的一部分的颜色是我无法找到的。

我发现了什么

我试图使用:

imageView.getDrawable().setColorFilter(..., PorterDuff.Mode.MULTIPLY)

对于两个ImageViews,但它似乎不起作用。它的作用实际上是改变了imageView的整个颜色,与我提供的颜色合并为参数。

这是有道理的,因为它只是一个colorFilter,类似于色调。

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

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

问题

如何混合2个imageViews?

3 个答案:

答案 0 :(得分:0)

由于您正在使用VectorDrawable,您是否考虑过为drawable而非视图设置动画?

https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable.html

答案 1 :(得分:0)

试试这个:

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 :(得分:0)

好吧,看起来似乎不可能使用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);
    }
}

用法:

    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);