我的应用有ListView图像。它使用Universal Image Loader(1.7.0)从Internet加载图像。
配置和显示选项:
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
.defaultDisplayImageOptions(defaultOptions)
.threadPoolSize(2)
.enableLogging()
.build();
getView()的一部分(我的应用重用ConvertView并使用ViewHolder模式):
View rowView = convertView;
ViewHolder holder;
if (rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.list_row, null, true);
holder = new ViewHolder();
holder.photoView = (ImageView) rowView.findViewById(R.id.list_photo_view);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
String photoUrl = "http://someserver.com/some_image.jpg";
mImageLoader.displayImage(photoUrl, holder.photoView);
list_row.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:clickable="true" >
<ImageView
android:id="@+id/list_photo_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="false"
android:contentDescription="@string/photo"
android:scaleType="centerInside"
android:src="@drawable/template_image_list" />
</LinearLayout>
当然,ImageView不是每行中的单个视图。这是短版:)。 因此,我从互联网上下载的图像大小为450x337。我正在平板电脑上测试我的应用程序,屏幕尺寸为1280x760。
当我启用日志记录时 - 我看到了这样的消息:
Load image from memory cache [http://someserver.com/some_image.jpg_1280x736]
依此类推......我对网址结尾有点困惑 - “_1280x736”。正如second part of manual所说:
•maxImageWidthForMemoryCache()和maxImageHeightForMemoryCache()用于将图像解码为Bitmap对象。为了不在存储器中存储全尺寸图像,将其缩小到由加载图像的ImageView参数的值确定的大小:maxWidth和maxHeight(第一阶段),layout_width和layout_height(第二阶段)。如果未定义这些参数(值fill_parent和wrap_content被视为不确定),则采用设置maxImageWidthForMemoryCache()和maxImageHeightForMemoryCache()指定的维度。原始图像的大小减少2倍(推荐用于快速解码),直到宽度或高度变得小于指定值; o默认值 - 设备屏幕的大小。
所以,据我所知,这个结尾是“reduce”:)之后内存缓存中图像的大小,而图像加载器使用了默认值(屏幕大小)。我并不感到惊讶的是图像加载器无法获得ImageView的大小(可能太早),但为什么原始图像被放大了?是否很难验证原始图像的大小并保留它们而不进行修改?当然,我可以为displayImage方法添加图像大小,但我需要解释...
答案 0 :(得分:2)
很详细的问题。
网址结尾,如“_ 1280x736”,并不代表结果位图的大小。缩小原始图像的目标尺寸。在您的情况下,它等于设备屏幕大小和原始图像(此目标大小较小)将不会缩放(直到您在显示选项中设置ImageScaleType.EXACTLY_STRETCHED
。)
所以不要担心。如果您在运行时看到真实的位图大小,那么您将看到原始图像大小(不是1280x736)。