2

在我的项目中,我正在从文件夹 drawable-hdpi 动态加载图像,ImageSwitcher如下所示:

int[] images = new int[2];
logoImage = (ImageSwitcher) findViewById(R.id.logo_image);
images[0] = getResources().getIdentifier(ej.getImagemResource(), "drawable", getPackageName());
images[1] = getResources().getIdentifier(ej.getImagemResolvidaResource(), "drawable", getPackageName());
//...
logoImage.setImageResource(images[0]);

但是对于设计问题,因为它将像 60000 幅小图像,每幅 300 x 300 像素,我决定将它们全部放入 assets 文件夹并开始加载它们,如下所示:

Drawable[] images = new Drawable[2];
images[0] = Drawable.createFromStream(getAssets().open(ej.getImagemResource() + ".png"), null);
images[1] = Drawable.createFromStream(getAssets().open(ej.getImagemResolvidaResource() + ".png"), null);
//...

问题在于,在第二种方式中,图像大小的显示方式因设备密度而异(我猜),但是当图像进入 drawable-hdpi 文件夹时,它们在任何密度下都显示得很好。

我该如何解决这个问题?或者将 60000 张图像放入 drawable-hdpi 文件夹是否有问题?哪种方法是“正确”的?

提前致谢

4

1 回答 1

5

当您将位图放在drawable-<density>文件夹中,并且设备的确切显示密度没有变体时,框架将<density>根据设备密度之间的比率自动缩放它。

这样做是为了使dps中的图像尺寸在设备之间保持不变(并且您没有义务为每种可能的密度提供变体)。

当您从资产加载时,“源”密度是未知的,因此不会执行此自动缩放。因此,差异。

如果您想从“就像 hdpi”一样从资产加载图像,您可以执行以下操作:

Options opts = new BitmapFactory.Options();
opts.inDensity = DisplayMetrics.DENSITY_HIGH;
drawable = Drawable.createFromResourceStream(context.getResources(), null, is, srcName, opts);

也就是说,将所有文件包含在可绘制文件夹中我根本看不到任何问题。

于 2014-07-04T20:10:48.683 回答