触摸点缩放预览

时间:2018-04-03 09:41:54

标签: android canvas bitmap preview

我正在研究扫描文档程序,我已经开发了一个程序,该程序使用图像处理扫描文档,并提供与CanScanner相同的裁剪图像选项。

现在我想要像凸轮扫描仪一样选择触摸图像变焦预览。我将如何实现此功能。 请参阅附图以供参考(我想开发的相同功能)

请帮助实现此功能。

提前致谢 Reference image for feature

2 个答案:

答案 0 :(得分:1)

您可以创建和使用BitmapShader(使用您正在绘制的图片的位图),MatrixPaint

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?Magnifying part of the canvas when touched

答案 1 :(得分:0)

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

创建一个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);

希望它有所帮助!快乐的编码!