0

我有 60 张图片用于我的应用程序。每张图片的大小只有(大约)25KB。我对大写使用单字母命名约定,对小写使用双字母。

一个.png

aa.png

在我的布局中,我有 10 个 ImageView,并且我根据从数据库中提取的单词以编程方式设置图像位图。

我的问题是,我可能没有正确实施下采样。我将所有 10 个 ImageView 添加到一个 ImageView 数组中,然后根据数据库中单词的字符数组找到它们来设置它们的位图值。这是我设置图像视图的方法:

for(int j = 0; j < myWord.length(); j++){

    char[] chars = myWord.toCharArray();
    if(Character.isUpperCase(chars[j])){

        int imgID = getResources().getIdentifier(String.valueOf(chars[j]).toLowerCase(), "drawable", getPackageName());

        letters[j].setTag(String.valueOf(chars[j]).toUpperCase());

        letters[j].setImageBitmap(CalculateSize.decodeSampledBitmapFromResource(getResources(), imgID, 75, 75));

    }else if(Character.isLowerCase(chars[j])){

        int imgID = getResources().getIdentifier(String.valueOf(chars[j]) + String.valueOf(chars[j]), "drawable", getPackageName());

        letters[j].setTag(chars[j] + chars[j]);

        letters[j].setImageBitmap(CalculateSize.decodeSampledBitmapFromResource(getResources(),imgID, 75, 75));


}

这是我调整大小的方法。我让它适用于带有inSampleSize = 4设置的 3 个字母的单词。但是,无论我将它设置为什么,我都无法让它再次工作:

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){

        // Height and Width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 12;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose smallest ratio as inSampleSize value.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }



        return inSampleSize;


    }


    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resID, int reqWidth, int reqHeight){

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resID, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resID, options);


    }



}
4

1 回答 1

0

最终我认为答案是只使用更小的图像。

我在我的代码中添加了调试日志记录,它给了我每个图像在采样之前的高度和宽度,然后它给了我选择的最小比率。

每个图像的分辨率为 930 x 1110 dp,我试图以该大小的 1/12 对其进行采样,但在崩溃之前,它仍在将堆增加到 42MB +。

我认为我需要做的是将图像大小调整为现在大小的 1/4,然后将其缩小一半,甚至 1/4。

我可以为阅读它的 8 个人更新这个问题,让你知道它是否有效。

编辑:更新了图像的原始大小,这完美无瑕。

于 2013-07-18T19:18:21.250 回答