android - 触摸时放大 Canvas 的一部分

标签 android android-layout zooming android-canvas

我有一个扩展 SurfaceView 的自定义 View 。我正在 Canvas 上绘制图像。当用户触摸 Canvas 上的一个点时,我想显示触摸坐标周围区域的放大 View 。最好是,随着手指四处移动,我想相应地更新放大 View 的内容。

我想知道android平台是否原生支持这样的功能。如果没有,你们中的任何一个能否给我指出一个可以让我开始或分享如何实现它的想法的好例子。我不怎么制作此类 2D 或 3D 图形,并且仍在尝试理解 Canvas 和 Matrix 类以了解我可以使用什么。

我在论坛上搜索了类似的问题,但没有找到。所以,请不要标记我问一个已经存在的问题。

不,我还没有使用 OpenGL-ES 或任何此类第 3 方库。

谢谢大家

最佳答案

要缩放您在 Canvas 上绘制的图像:

创建一个 BitmapShader(使用您正在绘制的图像的位图)、一个 Matrix 和一个 Paint:

shader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);
matrix = new Matrix();
shaderPaint = new Paint();
shaderPaint.setShader(shader);

在触摸事件中记录触摸位置(例如在 PointF 中):

zoomPos.x = event.getX();
zoomPos.y = event.getY();

...并设置着色器的矩阵(我在每次触摸时都这样做,可能有更好的方法):

matrix.reset();
matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);
shader.setLocalMatrix(matrix);

然后在绘图代码中,使用着色器Paint绘制一个圆。

canvas.drawCircle(zoomPos.x, zoomPos.y, size_of_the_circle, shaderPaint);

编辑

两行:

matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);

可以换成一个:

matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);

这允许在不破坏偏移量的情况下更改比例因子。

关于android - 触摸时放大 Canvas 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442934/

相关文章:

android - Android 2即时运行

android-layout - 如何防止软键盘调整背景图像的大小

javascript - 使用输入 slider 放大带有对象的伪空间的正确方法

ios - SAFARI 缩放屏幕问题

javascript - D3 变焦 v3 与 v5

android - 如何设置最大值edittext 控件中的文本长度

安卓 NFC : enable and disable the NFC detected sounds

android - 将 View 拖到 RelativeLayout 之外

Android 忽略 maxWidth

android - 如何忽略 "Text size is too small"