0

我需要在允许用户放大和缩小的视图中显示一个非常大的图像(例如 8000x8000)。

我已经检查了几个用于检测用户触摸并据此转换图像的选项。例如:

如何在 Android 中使用多点触控

以及其他使用手势/触摸检测器等的人。

问题是他们都不关心位图的大小和可能的崩溃,因为位图不适合内存。

所以我正在寻找的是如何像 Android 的 Gallery 那样实现它。放大图像时不会损失质量,当然也不会崩溃

有任何想法吗?根据答案的复杂性和质量,将获得最多 300 分的完整有效答案

4

2 回答 2

2

尝试仅显示位图的缩放子集并尽可能少地解码。我管理了类似的事情。这些是对我帮助很大的代码片段:

要计算您需要的所有值(例如比例因子、像素数等),您可以使用 inJustDecodeBounds 来获取位图的大小,而无需分配任何内存。:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opt);
int width = opt.outWidth;
int height = opt.outHeight;

要仅解码位图的子集,请使用以下命令:

Bitmap.createBitmap(
    source, 
    xCoordinateOfFirstPixel, 
    yCoordinateOfFirstPixel, 
    xNumberOfPixels, 
    yNumberOfPixels
);

要创建缩放位图:

Bitmap.createScaledBitmap(
    source, 
    dstWidth, 
    dstHeight, 
    filter
);

要绘制位图的子集:

Canvas.drawBitmap(
    source, 
    new Rect(
        subsetLeft, 
        subsetTop, 
        subsetRight, 
        subsetBottom
    ), 
    new Rect(0,0,dstWidth, dstHeight), 
        paint
);

编辑:我忘了提到这个用于创建缩放图像的片段。为了节省内存,这就是您想要的:

BitmapFactory.Options opt = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap scaledBitmap = BitmapFactory.decodeFile(path, opt);

因为 inSampleSize 必须是一个整数,所以我使用 createScaledBitmap 来稍微调整位图。

于 2012-05-18T18:07:42.993 回答
1

http://www.anddev.org/large_image_scrolling_using_low_level_touch_events-t11182.html

可能吗?

网站目前已关闭,因此最终可能与您无关,但我认为我应该发布它。

" ZOOM CONTROL (Widget) 监听 OnTouch 事件来处理平移 "

最后:

https://github.com/MikeOrtiz/TouchImageView

据我所知,^^ 可能正是您正在寻找的 2.0+

失败了,一个webview并像这样加载文件。

于 2012-05-18T12:37:56.677 回答