Android中对加载大图的处理

来源:互联网 发布:远程迅雷 linux 编辑:程序博客网 时间:2024/05/22 08:28

1.先看加载原理:Android中图片是以像素的形式加载到内存中。png、bmp、jpg等格式的图片(位图文件),都是以像素表述图片大小的。虚拟机的内存并不是无限的大,而是当前应用程序所能分配的内存。当图片的大小超过虚拟机内存的大小,就会出现OutOfMemoryError

2.如何解决?
a.思路: 把图片一相应的比例缩小,而不影响视觉效果。
代码如下:

public class ImageActivity extends Activity {    private EditText imageShow_et;    private ImageView imageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_image);        imageView = (ImageView) findViewById(R.id.image_iv);    }    public void showImage(View view) {        // 1.图片解析的配置:        BitmapFactory.Options options = new Options();        options.inJustDecodeBounds = true;// 加载图片的时候,只获取该图片的属性,而不返回bitmap        // 2.获取图片的宽高信息        BitmapFactory.decodeFile(                Environment.getExternalStoragePublicDirectory(                        Environment.DIRECTORY_PICTURES).getAbsolutePath()                        + "/big.JPG", options);        int pictureWidth = options.outWidth;        int pictureHeight = options.outHeight;        // 3.获取手机屏幕的宽高        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);        Display phoneDisplay = wm.getDefaultDisplay();        Point outSize = new Point();        phoneDisplay.getSize(outSize);        int screenWidth = outSize.x;        int screenHeight = outSize.y;        // 4.设置缩放比例:        int dx = pictureWidth / screenWidth;        int dy = pictureHeight / screenHeight;        int scale = 1;        if (dx > dy && dx > 1) {            scale = dx;        }        if (dy > dx && dy > 1) {            scale = dy;        }        // 5.设置图片的采样比例,对图片以缩放比例来显示图片        options.inSampleSize = scale;        options.inJustDecodeBounds = false;// 真的解析图拍了,并返回Bitmap        Bitmap bitmap = BitmapFactory.decodeFile(                Environment.getExternalStoragePublicDirectory(                        Environment.DIRECTORY_PICTURES).getAbsolutePath()                        + "/big.JPG", options);        imageView.setImageBitmap(bitmap);    }}

b.用Google本身提供的一套解决方案BitmapFun,它可以解决加载图片慢,OOM的问题.其中的ImageFetcher就是根据图片三级缓存原理来处理图片:先在内存中找,内存中找不到再在文件中找,最后是网络查找。清理图片缓存的时候可以用DiskLruCache.clearCache,一键清除。

c. 还可以使用xUtils中专门针对图片的BitmapUtils。

0 0
原创粉丝点击