【问题标题】:Multitouch gestures and Images in AndroidAndroid 中的多点触控手势和图像
【发布时间】:2012-05-19 02:21:16
【问题描述】:

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

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

How to use Multi-touch in Android

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

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

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

有什么想法吗?根据答案的复杂性和质量,完整、有效的答案将获得最高 300 分

【问题讨论】:

标签: java android image gallery


【解决方案1】:

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

要计算您需要的所有值(例如比例因子、像素数等),您可以使用 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 来稍微调整位图。

【讨论】:

    【解决方案2】:

    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 并像这样加载文件。

    【讨论】:

    • 感谢您的回答。我稍后会检查第一个链接,但第二个链接检测到触摸并重新缩放图像,但不关心内存管理。您可以检查尝试加载一个非常大的图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2020-12-12
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多