首页 文章

Viewpager具有大位图

提问于
浏览
0

嗨,我正在尝试构建类似水平图库的东西,我可以使用我的图库/相机中的图像添加或删除页面 .

我正在尝试使用大型位图,所以我使用算法来缩放位图并将其设置为每个页面的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 回答

  • 3

    缩放图像客户端:

    您已经在设备上使用了't need your own algorithm to scale an image if it' . ImageViewScaleType,您可以像这样设置:

    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
    

    (或带有 android:scaleType 属性的XML) .

    剩下的问题是如何从您的URL获取图像以显示在 ImageView 中 . 使用诸如SmartImageViewAndroid-Query(更强大)之类的库以异步方式实现(即不阻塞UI线程) .

    例如,使用SmartImageView,您可以使用以下内容:

    myImageView.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");
    

    只需阅读该页面上的示例,就会有更多选择 .

    扩展服务器端

    如果您有某种触发的调整大小算法,例如通过某些URL参数,使用this solution并根据需要传递宽度和高度(可能使用上述库之一) .

    正如您所说 getWidth()getHeight() 返回 0 ,请查看您为 ImageView 设置的 layout_widthlayout_height . 如果它是 fill_parent ,则应该没有问题,但如果必须是 wrap_content ,请考虑使用与最终图像具有相同宽高比的本地透明虚拟图像(直到设置了"real image") .

  • 0

    将bitmap factory与justInbounds选项一起使用 . 因此它只返回位图的维度而不将位图加载到ram .

    options.inJustDecodeBounds = true;
    
  • 0

    尝试将位图采样到屏幕大小(使用inJustDecodeBounds以获得位图的分辨率,并使用displayMatrics以获得屏幕的分辨率) .

    如果没有透明度,您可能还希望使用位图解码的RGB 565 format而不是8888 . 这将节省大约1/4的内存使用量 .

    在任何情况下,我建议reading this tutorial处理位图 .

相关问题