我需要在 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/