更改矢量图像的色调颜色时出现 OutOfMemoryError 错误

OutOfMemoryError error when changing the tint color of Vector images

我至少有 48 张小图像显示存储为可绘制的 XML 文件的矢量图像。我有一个包含 48 个项目的多选列表视图。当一个项目被选中时,我访问它的图像对应物并改变图像的色调。如果少于(大约)30 项被检查,则没有问题,但如果超过,则显示 OutOfMemoryError。这是代码示例:

   View.OnClickListener listener= new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               SparseBooleanArray checked = listView.getCheckedItemPositions();
               for (int i = 0; i < checked.size(); i++) {
                   // Item position in adapter
                   int position = checked.keyAt(i);
                   // Add sport if it is checked i.e.) == TRUE!
                   image = null;
                   if (checked.valueAt(i)) {
                       switch (position) {
                           case 1:
                               image = (ImageView) findViewById(R.id.image1);
                               image.setColorFilter(R.color.green);
                               break;
                           case 2:
                               image = (ImageView) findViewById(R.id.image2);
                               image.setColorFilter(R.color.green);
                               break;
                           case 3:
                               image = (ImageView) findViewById(R.id.image3);
                               image.setColorFilter(R.color.green);
                               break;
                            ....
                            case:48
                               image = (ImageView) findViewById(R.id.image48);
                               image.setColorFilter(R.color.green);
                               break;
                               }
                           }
                     }
 mybutton.OnClickListener(listener)

xml 文件中的图像示例

<RelativeLayout>
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image1"
            />
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image2"
            />
....
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image48"
            />
</RelativeLayout>

这个问题似乎是Bitmap图片的通病,但前面问题中提出的解决方案并不适合我的情况。你认为如果我将图像的 src 从 xml 矢量更改为简单的 png 会解决问题吗?如果没有,有什么建议吗?

您正在为每个图像创建一个单独的滤色器。创建一个单一的滤色器并在所有图像上使用它会减少对象的使用。但是,如果图像视图立即创建一个带有阴影的新位图,无论如何你都会 OOM - 你在这里创建了 48 个新位图,这是一个巨大的内存量。

其次,每次检查单个项目时,您都在为所有图像创建新的过滤器。那是非常低效的(特别是因为你在每种情况下都有 n 次搜索)并且会使上一段中的问题变得更糟。仅更改在每个单击处理程序中单击的单个项目。这样做 war 创建总和(i=1 到 n)i 个新图像,其中 n 是单击的图像数量 - 对于 n=30,即 430ish。

顺便说一句 - 在这里使用 switch 语句很糟糕。在开始时创建一个 imageViews 数组并索引到数组中,而不是每次都使用 findViewById 在视图树中进行 O(n) 搜索。这段代码很糟糕。