如何在图像缩放时用手指在图像上绘图?

时间:2017-06-18 04:57:47

标签: android image android-canvas

我正在尝试在我的项目中进行图像缩放时在图像上绘制一些东西但是当缩放时它会在触摸和绘图之间创建一些偏移,但是没有缩放它是完美的。例如。 enter image description here

图片缩放代码:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.concat(matrix);
        ....
    }

@Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView view = (ImageView) v;

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                lastEvent = null;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist = spacing(event);
                if (oldDist > 10f) {
                    savedMatrix.set(matrix);
                    midPoint(mid, event);
                    mode = ZOOM;
                }
                lastEvent = new float[4];
                lastEvent[0] = event.getX(0);
                lastEvent[1] = event.getX(1);
                lastEvent[2] = event.getY(0);
                lastEvent[3] = event.getY(1);
                d = rotation(event);
                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                break;

            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    matrix.set(savedMatrix);
                    matrix.postTranslate((event.getX() - start.x), (event.getY() - start.y));
                } else if (mode == ZOOM && event.getPointerCount() == 2) {
                    float newDist = spacing(event);
                    matrix.set(savedMatrix);
                    if (newDist > 10f) {
                        float scale = newDist / oldDist;
                        matrix.postScale(scale, scale, mid.x, mid.y);
                    }
                    if (lastEvent != null) {
                        float newRot = rotation(event);
                        float r = newRot - d;
                        matrix.postRotate(r, view.getMeasuredWidth() / 2, view.getMeasuredHeight() / 2);
                    }
                }
                break;
        }
        invalidate();

        return true;
    }

绘图代码:

@Override
    public boolean onTouch(View view, MotionEvent event) {

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

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchStart(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touchEnd();
                invalidate();
                break;
        }

        return true;
    }

    private void touchMove(float x, float y) {
        float f1 = Math.abs(x - mX);
        float f2 = Math.abs(y - mY);
        if ((f1 >= 4.0F) || (f2 >= 4.0F)) {
            path.quadTo(mX, mY,
                    (x + mX) / 2.0F,
                    (y + mY) / 2.0F);
            mX = x;
            mY = y;
        }
    }

    private void touchStart(float x, float y) {
        path.reset();
        path.moveTo(x, y);
        blurView.pathList.add(path);
        blurView.strokeWidthList.add(strokeWidth);
        mX = x;
        mY = y;
    }

    private void touchEnd() {
        path.lineTo(mX, mY);
        path = new Path();
    }

任何人都可以帮我了解如何处理比例因子或如何将图像缩放比例因子移到手指触摸中。

1 个答案:

答案 0 :(得分:0)

您通常存储比例因子,并将许多坐标处理系统乘以其值。

就这样。