Android应用程序将多个图像视图一起加载

时间:2015-04-07 14:47:45

标签: android android-layout bitmap imageview image-resizing

我有一个显示4个870x3700 jpeg图像(每个大约200KB)的活动的以下布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/scrollView2" >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/testlay">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:id="@+id/imageView1"
            android:contentDescription="@string/imageph" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:id="@+id/imageView2"
            android:contentDescription="@string/imageph" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:id="@+id/imageView3"
            android:contentDescription="@string/imageph" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:id="@+id/imageView4"
            android:contentDescription="@string/imageph" />
    </LinearLayout>
</ScrollView>
</LinearLayout>

以下代码在我的onCreate方法中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    setContentView(R.layout.test_pages);
    ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
    ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);
    ImageView imageView3 = (ImageView) findViewById(R.id.imageView3);
    ImageView imageView4 = (ImageView) findViewById(R.id.imageView4);
    imageView1.setImageResource(R.drawable.rsz_17_18_21);
    imageView2.setImageResource(R.drawable.rsz_22_25_29);
    imageView3.setImageResource(R.drawable.rsz_30_31_36);
    imageView4.setImageResource(R.drawable.rsz_37_38);

现在在平板电脑上,我可以毫无问题地显示它们,但是当我尝试在手机上运行应用程序时,它会引发内存不足的异常。我已经尝试了几种不同的调整大小方法,没有任何效果,即使用一种简单的方法来计算宽高比并返回给定屏幕宽度的高度。

如何调整所有图像的大小以避免将原始大小的图像加载到内存中并使其缩小到显示屏的宽度,同时保持宽高比?

1 个答案:

答案 0 :(得分:0)

尝试以下

首先计算仍然产生大于目标的图像的最大可能inSampleSize。 秒使用BitmapFactory.decodeFile(文件,选项)加载图像,并将inSampleSize作为选项传递。 第三个使用Bitmap.createScaledBitmap()调整大小到所需的尺寸。

希望这会对你有所帮助。

    Bitmap background = Bitmap.createBitmap((int)width, (int)height, Config.ARGB_8888);
float originalWidth = originalImage.getWidth(), originalHeight = originalImage.getHeight();
Canvas canvas = new Canvas(background);
float scale = width/originalWidth;
float xTranslation = 0.0f, yTranslation = (height - originalHeight * scale)/2.0f;
Matrix transformation = new Matrix();
transformation.postTranslate(xTranslation, yTranslation);
transformation.preScale(scale, scale);
Paint paint = new Paint();
paint.setFilterBitmap(true);
canvas.drawBitmap(originalImage, transformation, paint);
return background;