在可滚动的imageview中加载位图的一部分并在滚动时加载其余部分?

时间:2013-12-24 16:56:18

标签: android

我正在尝试将高图像的一部分加载到可滚动的图像视图(滚动视图内的imageview)。

它适用于较小的图像,但如果图像大于2048x2048,应用程序将因内存开放而崩溃。

我可以加载部分图像:

private Bitmap decodeBitmapRegion(InputStream in, Rect region) {
    BitmapRegionDecoder decoder = null;
    try {
        decoder = BitmapRegionDecoder.newInstance(in, false);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    region.right = decoder.getWidth();
    Bitmap reg = decoder.decodeRegion(region, null);

    return reg;
}

矩形可以是(0,0,DisplayWidth,800)。

在大多数情况下都适用,因为我使用imageview让用户裁剪图像的一部分并将其保存为coveriamge。图像视图的宽度与显示宽度相同,高度为400 dp。

因此,用户保存的图像宽度与原始图像相同,但只有400 dp的高度。

无论如何,用户是否可以一直滚动到原始图像的底部?

webview如何加载大于2048x2048的图片?

2 个答案:

答案 0 :(得分:0)

这是一个想法。

想象一下你的形象被分成几排乐队。使用ListView显示波段。 ListView使用适配器。在adapter.getView()中,您使用解码器加载适当的波段。

ListView已经"回收"。因此,它或多或少只能容纳足够的行来填充屏幕。

如果你的图像太宽,这种技术应该可以正常工作。如果它们是,并且它不够高,不能占用多个屏幕高度,那么您仍然会遇到相同的内存问题。更复杂的解决方案是使用某种网格视图,但是您必须自己进行视图回收。不是很难,但比使用ListView更难。

答案 1 :(得分:0)

我设法获得了我想要的功能。但我不认为这是最好的解决方案? 我将图像加载到webview中,然后我截取了webview的可见部分的屏幕截图。之后,我可以保存该位图,并做任何我想做的事。

但是,除了使用webview显示原始图像之外,还有更好的方法吗?

无论如何,这就是我所做的:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button1);
    imgView = (ImageView) findViewById(R.id.imageview);
    webView = (WebView) findViewById(R.id.webview);
    webView.loadUrl("file:///android_asset/test.jpg");
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            imgView.setImageBitmap(getBitmapForVisibleRegion(webView));

        }
    });
}

public static Bitmap getBitmapForVisibleRegion(WebView webview) {
    Bitmap returnedBitmap = null;
    webview.setDrawingCacheEnabled(true);
    returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache());
    webview.setDrawingCacheEnabled(false);
    return returnedBitmap;
}