我有2个imageView,一个在另一个上面,一起有动画。我需要它们相互融合,使用" Multiply"效果,在这个动画中。
与this question类似的颜色,但是有图像(在我的情况下是VectorDrawable,但如果需要我可以使用PNG)。
这是一张草图,用以展示我想做的事情:
请注意,重叠的图像部分比箭头的原始颜色更暗。
到目前为止,我无法找到办法。我当然知道如何将视图放在另一个视图的顶部,但是基于另一个视图改变位图的一部分的颜色是我无法找到的。
我试图使用:
imageView.getDrawable().setColorFilter(..., PorterDuff.Mode.MULTIPLY)
对于两个ImageViews,但它似乎不起作用。它的作用实际上是改变了imageView的整个颜色,与我提供的颜色合并为参数。
这是有道理的,因为它只是一个colorFilter,类似于色调。
我也为每个ImageView尝试了alpha,但这也意味着ImageViews的一部分(不重叠的部分)将具有半透明的颜色。
理论上我可以获得每个位图,然后对结果执行过滤,但这不实用,因为我需要在两者之间的动画中显示它。
如何混合2个imageViews?
答案 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);