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中编写,即使在开始时显示空图像,然后加载图像