根据设备分辨率Android

时间:2015-04-22 11:52:07

标签: android image out-of-memory

我在如何根据设备分辨率缩小位图时遇到问题,因此设备不会提供 outofmemory异常。

图片即将来自服务器。

假设我的位图具有良好的xxx-hdpi分辨率,但该位图太大了hdpi resloution设备,所以我想要的是根据运行时的屏幕重新缩放来缩小该位图。

我见过一些解决方案

How to scale an image down in android

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

但是这些解决方案不像我想要的那样工作

帮助和提示将得到赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

假设您知道如何缩减Bitmap。所以你只需要知道你应该缩小某个图像的尺寸。您可以使用类似的东西来确定设备屏幕大小(通常我在Application类中执行此操作):

displayMetrics =  getApplicationContext().getResources().getDisplayMetrics();
displayDensity = displayMetrics.densityDpi;
displayHeight = displayMetrics.heightPixels;
displayWidth =  displayMetrics.widthPixels;

现在由您自行决定应用允许的最大图片尺寸为displayHeightdisplayWidth值。
如果您想全屏显示图像,可以将最大图像边尺寸设置为displayHeight / 2(实际上您应该确定最大的屏幕边尺寸,对于智能手机,通常是高度)。
如果要在列表中显示某些预览,则应将预览的图像边尺寸限制为displayWidth / 3(再次确定最小的屏幕尺寸,对于智能手机,通常是宽度)。
我有这样的方法(以确定px中允许的最大ListView图像边尺寸):

public static int getDeviceMaxSideSizeByDensity(){
    int maxSideSize=128;
    if (isHiResDisplay!=null)
    {
        switch (displayDensity) {
            case 120:
                maxSideSize = 64;
                break;
            case 160:
                maxSideSize = 96;
                break;
            case 240:
                maxSideSize = 128;
                break;
            case 320:
                maxSideSize = 256;
                break;
            default:
                maxSideSize = 512;
                break;
        }
    }
    return maxSideSize;
}

您可以设置其他值,无论大小,再次由您决定 我建议你使用像Glide(Picasso,Fresco,UIL)这样的lib来摆脱这样的思想。让lib来决定。