更改矢量图像的色调颜色时出现 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) 搜索。这段代码很糟糕。
我至少有 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) 搜索。这段代码很糟糕。