1. 引言

2. Android图片缩放原理

3. 图片缩放代码解析

import android.graphics.Bitmap;
import android.graphics.Matrix;

public class ImageUtil {

    public static Bitmap scaleBitmap(Bitmap srcBitmap, int newWidth, int newHeight) {
        // 创建一个Matrix对象
        Matrix matrix = new Matrix();
        // 设置缩放比例
        matrix.postScale((float) newWidth / srcBitmap.getWidth(), (float) newHeight / srcBitmap.getHeight());
        // 创建新的Bitmap对象
        Bitmap newBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(), srcBitmap.getHeight(), matrix, true);
        return newBitmap;
    }
}

4. 实战技巧

4.1 避免内存溢出

  • 使用inSampleSize属性:通过设置BitmapFactory.OptionsinSampleSize属性,可以减小加载的图片尺寸,从而降低内存消耗。
  • 在加载图片前,先获取图片尺寸:使用BitmapFactory.decodeFile方法时,可以设置inJustDecodeBounds属性为true,从而获取图片尺寸,避免加载图片到内存中。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);
int newWidth = options.outWidth / 2;
int newHeight = options.outHeight / 2;
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
Bitmap scaledBitmap = BitmapFactory.decodeFile(imagePath, options);

4.2 使用缓存

  • 内存缓存:将图片缓存到内存中,以便快速访问。
  • 磁盘缓存:将图片缓存到磁盘上,以便在设备重启后仍然可以访问。

4.3 异步加载

  • 使用AsyncTask类:AsyncTask类可以轻松地将耗时操作放到后台线程执行。
  • 使用HandlerThreadExecutorService:通过创建自定义线程或线程池,可以实现更灵活的异步加载。

5. 总结