Drawable的深层副本

Sha*_*kar 21 android drawable imageview

我有一个ImageView.在它的onClick我得到它的Drawable:

Drawable dr = ((ImageView) v).getDrawable();
Run Code Online (Sandbox Code Playgroud)

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

zoomedImage.setImageDrawable(dr);
Run Code Online (Sandbox Code Playgroud)

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

这是一个深拷贝的情况还是有另一个问题?如果是,我怎么能深度复制原始Drawable,以便我可以将副本设置为缩放图像?

提前致谢.

小智 51

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

Drawable drwNewCopy = dr.getConstantState().newDrawable().mutate();
Run Code Online (Sandbox Code Playgroud)

  • 最后!这是创建可绘制对象的自治副本的解决方案。要对原始可绘制对象进行mutate()并不是一个好的解决方案,它并不总是有效。从drawable的缓存(即getContantState())创建一个新副本是可行的。此评论供其他人花了数小时使用此未成熟/未完成的api的注释。 (3认同)
  • Kotlin 的扩展: fun Drawable.copy() =constantState?.newDrawable()?.mutate() (2认同)

ern*_*azm 14

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

drawable.mutate().getConstantState().newDrawable();
Run Code Online (Sandbox Code Playgroud)

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

因此,不同的ImageViews使用不同的drawables并且没有拉伸.