触摸时画布的放大部分

VJ *_*ons 2 android zoom android-layout android-canvas

我有一个扩展SurfaceView的自定义视图.我正在画布上画一个图像.当用户触摸画布上的某个点时,我想要显示触摸坐标周围区域的放大视图.并且优选地,当手指移动时,我想相应地更新放大视图的内容.

我想知道android平台本机是否支持这样的功能.如果没有,你们中的一个人能否指出一个很好的例子,可以让我开始或分享如何实现它的想法.我没有做太多这种2D或3D图形,我仍然试图理解Canvas和Matrix类来看看我可以使用什么.

我在论坛上搜索了一个类似的问题,但找不到任何问题.所以,请不要标记我提出已经存在的问题.

不 - 我没有使用OpenGL-ES或任何此类第三方库(尚未).

谢谢大家.

nmw*_*nmw 9

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

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

shader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);
matrix = new Matrix();
shaderPaint = new Paint();
shaderPaint.setShader(shader);
Run Code Online (Sandbox Code Playgroud)

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

zoomPos.x = event.getX();
zoomPos.y = event.getY();
Run Code Online (Sandbox Code Playgroud)

...并设置着色器的矩阵(我在每次触摸时执行此操作,可能有更好的方法):

matrix.reset();
matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);
shader.setLocalMatrix(matrix);
Run Code Online (Sandbox Code Playgroud)

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

canvas.drawCircle(zoomPos.x, zoomPos.y, size_of_the_circle, shaderPaint);
Run Code Online (Sandbox Code Playgroud)

编辑

这两行:

matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);
Run Code Online (Sandbox Code Playgroud)

可以换成一个:

matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
Run Code Online (Sandbox Code Playgroud)

这允许在不破坏偏移的情况下改变比例因子.