嗨,我正在尝试构建类似水平图库的东西,我可以使用我的图库/相机中的图像添加或删除页面 .
我正在尝试使用大型位图,所以我使用算法来缩放位图并将其设置为每个页面的imageview . 该算法需要ImageView的宽度/高度(缩小) .
我遇到的问题是,当我执行自定义的PagerAdapter方法时,ImageView的宽度/高度尚不清楚(getWidth / getHeight返回0),因此它不起作用:
public Object instantiateItem(ViewGroup collection, int position) {
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.document_page, null);
((ViewPager) collection).addView(view, 0);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
// Obtain the image file URI
// Call algorithm to get scaled bitmap using ImageView width and height --> PROBLEM: imageView.getWidth()/Height() return 0!!
// Set ImageView with scaled bitmap to avoid OutOfMemory Exception
return view;
}
你有什么建议?
谢谢 .
3 回答
缩放图像客户端:
您已经在设备上使用了't need your own algorithm to scale an image if it' .
ImageView
有ScaleType,您可以像这样设置:(或带有
android:scaleType
属性的XML) .剩下的问题是如何从您的URL获取图像以显示在
ImageView
中 . 使用诸如SmartImageView或Android-Query(更强大)之类的库以异步方式实现(即不阻塞UI线程) .例如,使用SmartImageView,您可以使用以下内容:
只需阅读该页面上的示例,就会有更多选择 .
扩展服务器端
如果您有某种触发的调整大小算法,例如通过某些URL参数,使用this solution并根据需要传递宽度和高度(可能使用上述库之一) .
正如您所说
getWidth()
和getHeight()
返回0
,请查看您为ImageView
设置的layout_width
和layout_height
. 如果它是fill_parent
,则应该没有问题,但如果必须是wrap_content
,请考虑使用与最终图像具有相同宽高比的本地透明虚拟图像(直到设置了"real image") .将bitmap factory与justInbounds选项一起使用 . 因此它只返回位图的维度而不将位图加载到ram .
尝试将位图采样到屏幕大小(使用inJustDecodeBounds以获得位图的分辨率,并使用displayMatrics以获得屏幕的分辨率) .
如果没有透明度,您可能还希望使用位图解码的RGB 565 format而不是8888 . 这将节省大约1/4的内存使用量 .
在任何情况下,我建议reading this tutorial处理位图 .