Drawable的深层副本

时间:2012-10-25 08:22:12

标签: android imageview drawable

我有一个ImageView。在onClick中,我得到了Drawable:

Drawable dr = ((ImageView) v).getDrawable();

并将其设置为对话框的ImageView:

zoomedImage.setImageDrawable(dr);

但是当我关闭对话框或活动恢复时。原始位置的图像被拉伸并显示为大于其大小,导致图像中只有一部分图像可见。

这是一个深层复制还是有另一个问题? 如果是,如何深度复制原始Drawable,以便我可以将副本设置为缩放图像?

提前致谢。

5 个答案:

答案 0 :(得分:41)

最后我成功了! 我有类似的问题,当我在我的drawable上使用滤色器时它改变了drawable,它非常接近其他人的解决方案,但只有这对我有用:

Drawable drwNewCopy = dr.getConstantState().newDrawable().mutate();

答案 1 :(得分:14)

我设法使用以下代码复制drawable:

drawable.mutate().getConstantState().newDrawable();

此处mutate()使drawable mutable避免共享其状态,getConstantState().newDrawable()创建一个新副本。

因此,不同的ImageView使用不同的drawable并且没有拉伸。

答案 2 :(得分:1)

使用BitmapFactory将drawable分别转换为位图,然后对其进行更改。

答案 3 :(得分:0)

上述解决方案对我不起作用,但有效

val myDrawable = DrawableCompat.wrap(view.background).mutate() as GradientDrawable
myDrawable.setColor(ContextCompat.getColor(view.context, R.color.White))

答案 4 :(得分:-4)

您应该拨打dr.clone,然后在对象上调用mutate()

这将使drawable不共享任何状态

Drawable newdr = dr.clone();
newdr = newdr.mutate();

编辑:也许只是

Drawable  newdr = dr.mutate();

会奏效。试一试

相关问题