Android 将高密度图像用于低分辨率设备

Android 将高密度图像用于低分辨率设备,android,resolution,screen-resolution,android-screen-support,Android,Resolution,Screen Resolution,Android Screen Support,我只使用分辨率为xxhdpi的图像来缩小apk的大小 如果我在xxhdpi设备中运行我的应用程序,就可以了 当我在hdpi设备中运行我的应用程序时,它的响应非常慢 这一次是否用于在hdpi中渲染xxhdpi图像 这是一个正确的程序吗???不,这是一个不正确的程序,它很慢,有时它也可能会杀死你的应用程序,比如说MemoryOutOfException等等 您必须使用BitmapFactory以编程方式解码和降级图像 比如说 //decodes image and scales it to redu

我只使用分辨率为
xxhdpi
的图像来缩小apk的大小

如果我在
xxhdpi
设备中运行我的应用程序,就可以了

当我在
hdpi
设备中运行我的应用程序时,它的响应非常慢

这一次是否用于在
hdpi
中渲染
xxhdpi
图像


这是一个正确的程序吗???

不,这是一个不正确的程序,它很慢,有时它也可能会杀死你的应用程序,比如说MemoryOutOfException等等

您必须使用BitmapFactory以编程方式解码和降级图像

比如说

//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
    try {
        //decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=70;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(!(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)){
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
}
//解码图像并对其进行缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//找到正确的刻度值。它应该是2的幂。
所需的最终int_尺寸=70;
内部宽度=o.向外宽度,高度=o.向外高度;
int标度=1;

虽然(!(width_tmp/2No)这不是正确的过程,但速度很慢,有时它也可能会导致你的应用程序死机,比如说memoryoutofeception等等

您必须使用BitmapFactory以编程方式解码和降级图像

比如说

//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
    try {
        //decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=70;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(!(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)){
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
}
//解码图像并对其进行缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//找到正确的刻度值。它应该是2的幂。
所需的最终int_尺寸=70;
内部宽度=o.向外宽度,高度=o.向外高度;
int标度=1;

而(!(width_tmp/2如果要从res文件夹加载图像,请使用decodeFromResource()很好,只需将行从BitmapFactory.decodeStream(新文件输入流(f),null,o)更改为BitmapFactory.decodeSource(getResources(),R.drawable.unnamed,o);当有一个包含10个项目和所有图像的列表时,我使用了您的代码,加载这些图像需要3秒钟。如果有数百个图像,情况会更糟。我说的对吗?在asynctask中使用该函数在asynctask中编写,即使在开始时显示空图像,然后加载图像如果要加载res文件夹中的图像使用decodeFromResource()很好,只需将行从BitmapFactory.decodeStream(新文件输入流(f),null,o)更改为BitmapFactory.decodeSource(getResources(),R.drawable.unnamed,o);当有一个包含10个项目和所有图像的列表时,我使用了您的代码,加载这些图像需要3秒钟。如果有数百个图像,情况会更糟。对吗?在asynctask中使用该函数在asynctask中编写,即使在开始时显示空图像,然后加载图像