最近,在尝试在imageView中加载图像时,我遇到了“Out of Heap Memory”错误。所以我在互联网上找到了优化图像的方法。
我期待找到优化位图的最佳方法。
目前,我有一个ImageView,其高度为200dp,宽度为“match_parent”。基本上它水平填充屏幕,垂直占用200dp。
我正试图在这张图片中实现这样的目标。
这是我的主计划。
1)为1行创建布局(ImageView,TextView,文本后面的黑色半透明栏)
2)使用RecyclerView并膨胀数据
目前我被困在第1步(对代码不满意)。
我所做的是为行创建XML布局。
<RelativeLayout
android:id="@+id/layout_adventure_fragment"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp">
<ImageView
android:id="@+id/imageView_adventure_home_screen_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:background="@drawable/textview_background_gradient"
android:layout_alignParentBottom="true"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:paddingLeft="15dp"
android:textColor="#FFFFFF"
android:textSize="25sp"
android:id="@+id/textView_adventure_name_home_screen_fragment"
android:layout_width="match_parent"
android:layout_height="55dp"
android:text="Demo Text"/>
</RelativeLayout>
我稍后会根据排版指南调整TextView。
好的,基本上ImageView的高度是200dp。 为了压缩我的图像,我使用Android培训页面上的指南,该指南使用inSampleSize并在AsyncTask中加载图像。
要计算所需的高度我使用的东西我不确定它是否正确。由于我只关心压缩图像的高度,我只通过高度来计算inSampleSize。
DisplayMetrics disp = getApplicationContext().getResources().getDisplayMetrics();
int density = disp.densityDpi;
width = disp.widthPixels;
height = (int)((float)(200.0/160.0) * (float)density);
Bitmap b =decodeSampledBitmapFromResource(getResources(),R.drawable.shake,height);
loadBitmap(R.drawable.shake,iV);
最后,我从最终位图中提取所需宽度和高度的缩略图,向用户显示填充imageView的图像,而不是仅位于带边距的中心。
imageView.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap,width,height));
可在此处找到完整代码:http://pastebin.com/mhKi1sKd
优化imageView的最佳方法是什么,以便在RecyclerView中显示多个图像时,堆内存不会满,如果我的程序中有不必要的代码,只需要处理和宝贵的时间?< / p>
这是我迄今所取得的成就。
答案 0 :(得分:1)
查看Picasso
库。
处理Android上图像加载的许多常见缺陷 由毕加索自动完成:
Handling ImageView recycling and download cancelation in an adapter. Complex image transformations with minimal memory use. Automatic memory and disk caching.