android 解决 imageview 加载长图 模糊的问题
时间: 2023-08-16 18:05:26 浏览: 422
在 Android 中,如果使用 `ImageView` 直接加载长图,可能会出现模糊的情况。这是因为 `ImageView` 默认只会根据自己的尺寸缩放图片,如果图片比 `ImageView` 大很多,那么缩放比例就会很大,导致图片变得模糊。
为了解决这个问题,可以使用以下两种方法:
1. 使用 `BitmapRegionDecoder` 加载局部区域的图片
可以使用 `BitmapRegionDecoder` 加载图片的局部区域,然后将局部区域的图片显示在 `ImageView` 中,这样就可以避免图片缩放比例过大而导致的模糊问题。
下面是使用 `BitmapRegionDecoder` 加载局部区域图片的示例代码:
```java
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static Bitmap decodeRegionFromBitmap(Bitmap bitmap, Rect rect) {
BitmapRegionDecoder decoder = null;
Bitmap bitmapRegion = null;
try {
decoder = BitmapRegionDecoder.newInstance(bitmap, false);
bitmapRegion = decoder.decodeRegion(rect, null);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (decoder != null) {
decoder.recycle();
}
}
return bitmapRegion;
}
// 计算 inSampleSize 的方法
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
```
然后在 `ImageView` 中加载局部区域的图片:
```java
Bitmap bitmap = decodeSampledBitmapFromResource(getResources(), R.drawable.large_image, imageView.getWidth(), imageView.getHeight());
Rect rect = new Rect(0, 0, imageView.getWidth(), imageView.getHeight());
Bitmap regionBitmap = decodeRegionFromBitmap(bitmap, rect);
imageView.setImageBitmap(regionBitmap);
```
2. 使用 `SubsamplingScaleImageView` 加载大图
`SubsamplingScaleImageView` 是一个开源库,可以用来加载大图并进行缩放、拖拽等操作。使用这个库可以避免图片缩放比例过大而导致的模糊问题。
下面是使用 `SubsamplingScaleImageView` 加载大图的示例代码:
1. 在 app 的 build.gradle 文件中添加依赖项:
```groovy
implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0'
```
2. 在布局文件中添加 `SubsamplingScaleImageView`:
```xml
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
3. 在代码中加载图片:
```java
SubsamplingScaleImageView imageView = findViewById(R.id.imageView);
imageView.setImage(ImageSource.resource(R.drawable.large_image));
```
这样就可以使用 `SubsamplingScaleImageView` 加载大图并避免模糊问题了。
阅读全文