Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将相同的BitmapDrawable分配给多个对象?_Java_Android_Bitmap - Fatal编程技术网

Java 是否可以将相同的BitmapDrawable分配给多个对象?

Java 是否可以将相同的BitmapDrawable分配给多个对象?,java,android,bitmap,Java,Android,Bitmap,我创建了一个BitmapDrawable,稍后在类似这样的函数中分配给多个对象(不完全像这样,但为了测试目的将其剥离): 这样做可以创建一个大小为50 x 50的位图绘制程序,我会将其保存在内存中。然后,我将此位图可绘制分配给各种按钮、复选框,以及任何出现并需要特定颜色的对象 我遇到的问题是BitmapDrawables不知何故被截断了。看起来,如果我将其分配给一个高度为80的按钮,然后再分配给一个高度为160的按钮,第一个按钮填充得很好,而后一个按钮只填充了一半。看起来BitmapDrawab

我创建了一个BitmapDrawable,稍后在类似这样的函数中分配给多个对象(不完全像这样,但为了测试目的将其剥离):

这样做可以创建一个大小为50 x 50的位图绘制程序,我会将其保存在内存中。然后,我将此位图可绘制分配给各种按钮、复选框,以及任何出现并需要特定颜色的对象

我遇到的问题是BitmapDrawables不知何故被截断了。看起来,如果我将其分配给一个高度为80的按钮,然后再分配给一个高度为160的按钮,第一个按钮填充得很好,而后一个按钮只填充了一半。看起来BitmapDrawable设置为第一次使用它,并且所有后续分配都受到它的限制。有时它会立即发生有时它只会在我切换到另一个选项卡并返回到上一个选项卡时发生


我认为BitmapDrawable将保持在50x50的内存中,并且分配给它的对象要么获得其自己的大小合适的版本(或者在渲染时制作一个调整大小的副本),而不是以某种方式更改BitmapDrawable本身。我承认,我不确定所有这些是如何深入工作的,如果我必须为分配给它们的每个对象创建单独的BitmapDrawable,或者我是否可以做其他事情,我将非常感谢任何关于我做错了什么的建议。

BitmapDrawable是一个对象,包含对象实例非常特定的方法,例如。所以,不,我不认为BitmapDrawable可以很容易地共享。(您可能能够成功地重用它们,就像ListView缓存列表成员的视图一样;但要求BitmapDrawable同时居住在两个或多个地方似乎要求太多。)

BitmapDrawable是一个对象,包含一些方法,例如,这些方法非常特定于该对象的实例。所以,不,我不认为BitmapDrawable可以很容易地共享。(您可能能够成功地重用它们,就像ListView缓存列表成员的视图一样;但要求BitmapDrawable同时居住在两个或多个地方似乎要求太多。)

您应该看看BitmapDrawable.mutate()。它将创建一个drawables常量状态的副本,但仍然在drawables之间共享不存在的位图

ImageView imgView1 = findByViewId(R.id.my_image_view_1);
ImageView imgView2 = findByViewId(R.id.my_image_view_2);

BitmapDrawable image = new BitmapDrawable("/path/to/my/bitmap");

imgView1.setImageDrawable(image);
imgView2.setImageDrawable(image.mutate());
这将为您提供两种不同的状态,而无需复制位图

这里有一篇关于它的好文章:

您应该看看BitmapDrawable.mutate()。它将创建一个drawables常量状态的副本,但仍然在drawables之间共享不存在的位图

ImageView imgView1 = findByViewId(R.id.my_image_view_1);
ImageView imgView2 = findByViewId(R.id.my_image_view_2);

BitmapDrawable image = new BitmapDrawable("/path/to/my/bitmap");

imgView1.setImageDrawable(image);
imgView2.setImageDrawable(image.mutate());
这将为您提供两种不同的状态,而无需复制位图

这里有一篇关于它的好文章:

谢谢你的建议。然后,我将为对象使用单独的位图。但是我会对列表视图使用相同的视图,因为我没有遇到任何问题,这应该没问题,对吧?@HardCoder:我不确定你的问题是什么意思。不过,只要BitmapDrawable一次只出现在一个视图中,就可以了。但是,这包括单个ListView项。如果你想在两个不同的ListView项目上使用相同的BitmapDrawable,你需要确保它们永远不会同时可见。到目前为止,我在不同的ListView和不同的项目中使用它们,到目前为止没有问题。但我会为列表制作不同的BTIMAPDrawTables。我确实有一些情况下,它们在同一时间对不同的项目是可见的,但从来没有任何问题(即使是2个列表tbh)。为了安全起见,我是否应该更改它?@HardCoder:这当然是我的建议。顺便说一句,从BitmapDrawable的源代码来看,似乎可以将相同的基础位图分配给多个BitmapDrawable。(我一直在猜测这是真的,但直到现在我还没有足够的把握提出这一点。)如果你担心节省内存,共享位图可能会解决大部分内存问题。谢谢你的建议。然后,我将为对象使用单独的位图。但是我会对列表视图使用相同的视图,因为我没有遇到任何问题,这应该没问题,对吧?@HardCoder:我不确定你的问题是什么意思。不过,只要BitmapDrawable一次只出现在一个视图中,就可以了。但是,这包括单个ListView项。如果你想在两个不同的ListView项目上使用相同的BitmapDrawable,你需要确保它们永远不会同时可见。到目前为止,我在不同的ListView和不同的项目中使用它们,到目前为止没有问题。但我会为列表制作不同的BTIMAPDrawTables。我确实有一些情况下,它们在同一时间对不同的项目是可见的,但从来没有任何问题(即使是2个列表tbh)。为了安全起见,我是否应该更改它?@HardCoder:这当然是我的建议。顺便说一句,从BitmapDrawable的源代码来看,似乎可以将相同的基础位图分配给多个BitmapDrawable。(我一直在猜测这是真的,但直到现在我还没有足够的把握提出这一点。)如果你担心节省内存,共享位图可能会解决大部分内存问题。