java - Android 中的多点触控手势和图像

标签 java android image gallery

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

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

How to use Multi-touch in Android

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

问题是它们都没有考虑位图大小以及可能的崩溃,因为位图不适合内存。

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

有什么想法吗?完整、可行的答案将获得高达 300 分的奖励,具体取决于答案的复杂性和质量

最佳答案

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

要计算您需要的所有值(例如比例因子、像素数等),您可以使用 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
);

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

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

由于 inSampleSize 必须是整数,因此我使用 createScaledBitmap 来稍微调整位图。

关于java - Android 中的多点触控手势和图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652686/

相关文章:

r - 如何在 R 中显示 base64 图像

java - 无法从 SQLite 数据库填充我的 Activity (DrinkActivity)

java - 用 Java 创建实时协作记事本

java - 内存映射文件 java NIO

java - OpenSAML (2.0) 签名验证不起作用

java - Android Studio - JAVA - 井字游戏

java.lang.IllegalStateException : Content view not yet created while using drawer

java - 如何从 PhoneStateListener 类获取上下文

android - 使用 Picasso 的自定义下载器

c# - 如何使用 MS Open XML SDK 检索一些图像数据和格式?