与自制图像缩放器相比,缩放图像速度较慢

时间:2014-08-02 14:36:15

标签: android imageview

所以我使用视图寻呼机来显示多个片段。每个片段包含多个图像。图像必须显示在屏幕的整个宽度上,但图像也必须保持其宽高比。首先我认为我可以像下面这样做,因为图像是静态的:

<ImageView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:scaleType="fitXY"
                android:adjustViewBounds="true"
                android:src="@drawable/image"
                android:contentDescription="@string/imageView_ride_height_overview_content_description"
                android:id="@+id/imageView_ride_height_overview"/>

然而,我的观看者变得有点呆滞。所以我启动了层次结构查看器,看到图像花了大约50ms来绘制。这太过于让我的viewpager顺利运行了。

我想也许图像的缩放时间太长,所以我实现了自己的图像缩放器,它看起来像这样:

    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.image);
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = bitmapOrg.getWidth();
    int height = bitmapOrg.getHeight();
    float scale = (float) display.getWidth()/width;
    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);
    Bitmap resisizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
    imageView.setImageBitmap(resisizedBitmap);

使用此图像缩放器,绘图(使用层次结构查看器测量)仅需要6ms。两种方式都得到相同的结果,除了绘图速度在我的图像缩放器上更低。任何人都知道为什么这两件事在绘制速度方面有很大差异?

1 个答案:

答案 0 :(得分:0)

在我看来,同时在内存中有两个位图是导致行为迟缓的原因。

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.image);
//other code ommited
Bitmap resisizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);

从Android开发者网站获取的更简单的函数将有助于解码位图而不复制它:

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);
}