Увеличить отображение неправильной позиции растрового изображения в Android

Может быть, этот вопрос дублирует, но я искал много вещей, связанных с этим, но не могу найти решение. Я пытаюсь увеличить круг над пользователем, который касается растрового изображения, я получаю координаты x и y из onTouchListner, все в порядке, но мое увеличение отображает неправильную позицию,

Как я могу решить эту проблему

Вот мой код

    public class ImageSurfaceMagnify extends SurfaceView implements SurfaceHolder.Callback {

    private Bitmap icon;
    private Paint paint, shaderPaint;
    /**
     * Magnify
     */
    private BitmapShader shader;
    PointF zoomPos = new PointF(0,0);
    Matrix matrix;
    private boolean zooming = false;

    public ImageSurfaceMagnify(Context context, File image, Bitmap resource) {
        super(context);
        getHolder().addCallback(this);
        setWillNotDraw(false);
        icon = resource;
        paint = new Paint();

        /**
         * Magnify
         */
        shader = new BitmapShader(icon, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        matrix = new Matrix();
        shaderPaint = new Paint();
        shaderPaint.setShader(shader);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(icon != null && !zooming) {
            int newWidth = canvas.getHeight() * icon.getWidth() / icon.getHeight();
            icon = Bitmap.createScaledBitmap(icon, newWidth, canvas.getHeight(), false);
            canvas.drawColor(Color.BLACK);
            int cx = (canvas.getWidth() - icon.getWidth()) / 2;
            int cy = (canvas.getHeight() - icon.getHeight()) / 2;
            Log.e("New", "Width  " + newWidth + "  Hight " + canvas.getHeight()+"  cx "+cx+"  cy  "+cy);
            canvas.drawBitmap(icon, cx, cy, paint);
        }else{
            matrix.reset();
            matrix.postScale(1.5f, 1.5f);
            matrix.postTranslate(-zoomPos.x, -zoomPos.y);
            //matrix.postScale(2f, 2f, -zoomPos.x, -zoomPos.y);
            shader.setLocalMatrix(matrix);
            canvas.drawCircle(zoomPos.x+100, zoomPos.y+100, 100, shaderPaint);
        }
    }

    @Override
    public boolean onTouchEvent(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;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @SuppressLint("WrongCall")
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas(null);
            synchronized (holder) {
                onDraw(canvas);
            }
        } catch (Exception e) {
            e.printStackTrace();
            if (canvas != null)
                onDraw(canvas);
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
}

Результат x и y точен, если я рисую круг, но Magnify - это другая позиция, почему?

0 ответов

Другие вопросы по тегам