触摸时放大画布的一部分(Magnifying part of the canvas when tou

2019-06-26 05:03发布

我有一个延伸SurfaceView自定义视图。 我在画布上绘制图像。 当用户触摸在画布上的一个点,我想说明各地触摸坐标区域的放大图。 并且优选地,作为手指来回移动,我想相应地更新放大视图的内容。

我在想,如果Android平台支持这样的功能本身。 如果没有,你一个指向我,可以让我开始或分享如何实现它的想法一个很好的例子。 我没有做很多2D或这类3D图形,现在还在试图了解Canvas和矩阵类,看看有什么我可以使用。

我搜索了论坛,类似的问题,但找不到任何。 所以,请询问已经存在的问题,不旗我。

而且没有 - 我没有使用OpenGL-ES或任何这样的第三方库(还)。

感谢所有。

Answer 1:

要缩小你的画布上绘制图像:

创建BitmapShader(使用你绘制图像的位图),矩阵和油漆:

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);

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

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);

这使得没有受到破坏的补偿要更改的比例因子。



文章来源: Magnifying part of the canvas when touched