Magnifying part of the canvas when touched

后端 未结 1 975
野趣味
野趣味 2020-12-29 00:51

I have a custom view that extends SurfaceView. I am drawing an image on the canvas. When the user touches a point on the canvas, i want to show a magnified view of the area

相关标签:
1条回答
  • 2020-12-29 01:12

    To zoom the image you're drawing on the canvas:

    Create a BitmapShader (using the bitmap of the image you're drawing), a Matrix and a Paint:

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

    On a touch event record the touch position (e.g. in a PointF):

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

    ...and set up the shader's matrix (I do this on each touch, there's probably a better way):

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

    Then in the drawing code, draw a circle using the shader Paint.

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

    Edit

    The two lines:

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

    Can be replaced with one:

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

    This allows the scale factor to be changed without breaking the offset.

    0 讨论(0)
提交回复
热议问题