所以我使用视图寻呼机来显示多个片段。每个片段包含多个图像。图像必须显示在屏幕的整个宽度上,但图像也必须保持其宽高比。首先我认为我可以像下面这样做,因为图像是静态的:
<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。两种方式都得到相同的结果,除了绘图速度在我的图像缩放器上更低。任何人都知道为什么这两件事在绘制速度方面有很大差异?
答案 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);
}