触摸点缩放预览
Touch point zoom preview
我正在开发扫描文档程序,我已经开发了一个程序,可以使用图像处理扫描文档,并提供裁剪图像的选项,就像 CanScanner 一样。
现在我想要触摸图像缩放预览,就像凸轮扫描仪提供的选项一样。我将如何实现此功能。
请找到附件图片以供参考(我想开发的相同功能)
请帮助实现此功能。
提前致谢
您可以创建和使用 BitmapShader
(使用您正在绘制的图像的位图)、Matrix
和 Paint
。
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
mPaint = new Paint();
mPaint.setShader(mShader);
然后设置一个手势运动事件来记录触摸位置。我们将在下一步中基于此位置设置着色器的矩阵。
@Override
public boolean onTouch(View view, MotionEvent event) {
int action = event.getAction();
zoomPos.x = event.getX();
zoomPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
zooming = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
zooming = false;
this.invalidate();
break;
default:
break;
}
return true;
}
然后在绘图代码中,使用postScale()
根据裁剪区域的坐标对矩阵进行缩放和平移。然后使用着色器Paint画一个圆来显示放大镜。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (zooming) {
matrix.reset();
matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
mPaint.getShader().setLocalMatrix(matrix);
canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint);
}
}
参见:Android - How to circular zoom/magnify part of image? and Magnifying part of the canvas when touched
要缩放您在 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);
希望对您有所帮助!编码愉快!
我正在开发扫描文档程序,我已经开发了一个程序,可以使用图像处理扫描文档,并提供裁剪图像的选项,就像 CanScanner 一样。
现在我想要触摸图像缩放预览,就像凸轮扫描仪提供的选项一样。我将如何实现此功能。 请找到附件图片以供参考(我想开发的相同功能)
请帮助实现此功能。
提前致谢
您可以创建和使用 BitmapShader
(使用您正在绘制的图像的位图)、Matrix
和 Paint
。
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
mPaint = new Paint();
mPaint.setShader(mShader);
然后设置一个手势运动事件来记录触摸位置。我们将在下一步中基于此位置设置着色器的矩阵。
@Override
public boolean onTouch(View view, MotionEvent event) {
int action = event.getAction();
zoomPos.x = event.getX();
zoomPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
zooming = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
zooming = false;
this.invalidate();
break;
default:
break;
}
return true;
}
然后在绘图代码中,使用postScale()
根据裁剪区域的坐标对矩阵进行缩放和平移。然后使用着色器Paint画一个圆来显示放大镜。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (zooming) {
matrix.reset();
matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
mPaint.getShader().setLocalMatrix(matrix);
canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint);
}
}
参见:Android - How to circular zoom/magnify part of image? and Magnifying part of the canvas when touched
要缩放您在 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);
希望对您有所帮助!编码愉快!