我有一个ImageView。在onClick中,我得到了Drawable:
Drawable dr = ((ImageView) v).getDrawable();
并将其设置为对话框的ImageView:
zoomedImage.setImageDrawable(dr);
但是当我关闭对话框或活动恢复时。原始位置的图像被拉伸并显示为大于其大小,导致图像中只有一部分图像可见。
这是一个深层复制还是有另一个问题? 如果是,如何深度复制原始Drawable,以便我可以将副本设置为缩放图像?
提前致谢。
答案 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();
会奏效。试一试