【问题标题】:OutOfMemoryError error when changing the tint color of Vector images更改矢量图像的色调颜色时出现 OutOfMemoryError 错误
【发布时间】:2016-01-05 23:43:59
【问题描述】:

我至少有 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>

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

【问题讨论】:

  • 代码在那里:image.setColorFilter(R.color.green);

标签: java android out-of-memory android-image


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个完美的答案。我没有意识到我可以在 Android 中做两件事,首先,创建一个 imageViews 数组,其次(最重要的是)调用一个名为 OnItemClickListener 的方法。是的,在阅读了您的回答后,我意识到我的代码有多糟糕。
猜你喜欢
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多