触摸屏是根据缩放的图像不调整 [英] Touch screen is not adjusting according to zoomed image

查看:200
本文介绍了触摸屏是根据缩放的图像不调整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做android系统中的图像注释和我加缩放功能进去。所以,现在当我缩放图像,之后做任何注解,它不是在这一点上,我感动,而不是其上做作为原始图像(未缩放图像)的屏幕。

的onDraw方法

  @覆盖
保护无效的onDraw(帆布油画){
    super.onDraw(画布);
    onDrawReady = TRUE;    imageRenderedAtLeastOnce = TRUE;
    canvas.concat(矩阵);    对于(DrawObject D:路径){
        如果(d.getType()== MODE_DRAWING){
            canvas.drawPath(d.getPair()首先,d.getPair()秒。);
        }否则如果(d.getType()== MODE_TEXT){
            canvas.drawText(d.getText(),d.getX(),d.getY(),d.getPair()秒。);
        }否则如果(d.getType()== MODE_ARROW){
            canvas.drawLine(d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()第二);
            fillArrow(帆布,d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()秒。);
        }否则如果(d.getType()== MODE_CIRCLE){
            RectF oval2 =新RectF(d.getStartX(),d.getStartY(),d.getX(),d.getY());
            canvas.drawOval(oval2,d.getPair()秒。);
        }否则如果(d.getType()== MODE_RECTANGLE){
            canvas.drawRect(d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()第二);
        }否则如果(d.getType()== MODE_ERASE){
            canvas.drawPath(d.getPair()首先,d.getPair()秒。);
        }
    }
    canvas.save();
}

onTouch法

  @覆盖
公共布尔onTouch(视图V,MotionEvent事件){
        mScaleDetector.onTouchEvent(事件);
        mGestureDetector.onTouchEvent(事件);
        的PointF CURR =新的PointF(event.getX(),event.getY());        MX = event.getX()+ mDistX;
        我= event.getY()+ mDistY;        如果(状态== || State.NONE状态== || State.DRAG状态== State.FLING){
            开关(event.getAction()){
            案例MotionEvent.ACTION_DOWN:
                图形,drawflag = FALSE;
                mStartX = MX;
                mStartY =我;                如果(mMode服务== MODE_ARROW){
                    的mpath =新路径();
                    mLineDrawObject =新DrawObject(MODE_ARROW,对新<路径,油漆和GT;(的mpath,getLinePaint()));
                    图形,drawflag = TRUE;
                }否则如果(mMode服务== MODE_TEXT){
                    图形,drawflag = TRUE;
                }否则如果(mMode服务== MODE_CIRCLE){
                    的mpath =新路径();
                    mCircleDrawObject =新DrawObject(MODE_CIRCLE,对新<路径,油漆和GT;(的mpath,getCirclePaint()));
                    图形,drawflag = TRUE;
                }否则如果(mMode服务== MODE_RECTANGLE){
                    的mpath =新路径();
                    mRectangleObject =新DrawObject(MODE_RECTANGLE,对新<路径,油漆和GT;(的mpath,getRectanglePaint()));
                    图形,drawflag = TRUE;
                }否则如果(mMode服务== MODE_DRAWING){
                    的mpath =新路径();
                    mDrawingDrawObject =新DrawObject(MODE_DRAWING,对新<路径,油漆和GT;(的mpath,getDrawPaint()));
                    图形,drawflag = TRUE;
                }否则如果(mMode服务== MODE_ERASE){
                    的mpath =新路径();
                    mEraseObject =新DrawObject(MODE_ERASE,对新<路径,油漆和GT;(的mpath,getErasePaint()));
                    图形,drawflag = TRUE;
                }
                如果(图形,drawflag ==真){
                    touch_start(MX,我的);
                    无效();
                }                last.set(CURR);
                如果(一扔!= NULL){
                    fling.cancelFling();
                }
                的setState(State.DRAG);
                打破;            案例MotionEvent.ACTION_MOVE:
                如果(状态== State.DRAG&放大器;&放图形,drawflag == FALSE){
                    浮DELTAX = curr.x - last.x;
                    浮DELTAY = curr.y - last.y;
                    浮fixTransX = getFixDragTrans(DELTAX,viewWidth,
                            getImageWidth());
                    浮fixTransY = getFixDragTrans(DELTAY,viewHeight,
                            getImageHeight());
                    matrix.postTranslate(fixTransX,fixTransY);                    fixTrans();
                    last.set(curr.x,curr.y);
                }
                如果(图形,drawflag ==真){
                    TOUCH_MOVE(MX,我的);
                    无效();
                }
                打破;            案例MotionEvent.ACTION_UP:
                如果(图形,drawflag ==真){
                    润色();
                }
                打破;
            案例MotionEvent.ACTION_POINTER_UP:
                的setState(State.NONE);
                打破;            }
        }        setImageMatrix(矩阵);
        //mCanvas.concat(matrix);        //
        //用户自定义OnTouchListener
        //
        如果(userTouchListener!= NULL){
            userTouchListener.onTouch(ⅴ,事件);
        }        //
        // OnTouchImageViewListener设置:TouchImageView用户拖动。
        //
        如果(touchImageViewListener!= NULL){
            touchImageViewListener.onMove();
        }        //
        //表示事件已处理
        //
        返回true;
    }
}


解决方案

您可以试试下面的onDraw和onTouch方法。

的onDraw

  @覆盖
保护无效的onDraw(帆布油画){
    onDrawReady = TRUE;
    imageRenderedAtLeastOnce = TRUE;
    如果(delayedZoomVariables!= NULL){
        setZoom(delayedZoomVariables.scale,delayedZoomVariables.focusX,delayedZoomVariables.focusY,delayedZoomVariables.scaleType);
        delayedZoomVariables = NULL;
    }
    super.onDraw(画布);
}

onTouch

  @覆盖
    公共布尔onTouch(视图V,MotionEvent事件){
        mScaleDetector.onTouchEvent(事件);
        mGestureDetector.onTouchEvent(事件);
        的PointF CURR =新的PointF(event.getX(),event.getY());        如果(状态== || State.NONE状态== || State.DRAG状态== State.FLING){
            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    last.set(CURR);
                    如果(一扔!= NULL)
                        fling.cancelFling();
                    的setState(State.DRAG);
                    打破;                案例MotionEvent.ACTION_MOVE:
                    如果(状态== State.DRAG){
                        浮DELTAX = curr.x - last.x;
                        浮DELTAY = curr.y - last.y;
                        浮fixTransX = getFixDragTrans(DELTAX,viewWidth,getImageWidth());
                        浮fixTransY = getFixDragTrans(DELTAY,viewHeight,getImageHeight());
                        matrix.postTranslate(fixTransX,fixTransY);
                        fixTrans();
                        last.set(curr.x,curr.y);
                    }
                    打破;                案例MotionEvent.ACTION_UP:
                案例MotionEvent.ACTION_POINTER_UP:
                    的setState(State.NONE);
                    打破;
            }
        }        setImageMatrix(矩阵);        //
        //用户自定义OnTouchListener
        //
        如果(userTouchListener!= NULL){
            userTouchListener.onTouch(ⅴ,事件);
        }        //
        // OnTouchImageViewListener设置:TouchImageView用户拖动。
        //
        如果(touchImageViewListener!= NULL){
            touchImageViewListener.onMove();
        }        //
        //表示事件已处理
        //
        返回true;
    }
}

I am doing image annotations in android and I've added zooming functionality into it. So now when I am zooming the image and after that doing any annotation, its not on that point where I touched the screen rather than its doing on as that of original image (Unzoomed Image).

onDraw Method

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

    imageRenderedAtLeastOnce = true;
    canvas.concat(matrix);

    for (DrawObject d : paths) {
        if (d.getType() == MODE_DRAWING) {
            canvas.drawPath(d.getPair().first, d.getPair().second); 
        } else if (d.getType() == MODE_TEXT) {
            canvas.drawText(d.getText(), d.getX(), d.getY(), d.getPair().second);
        } else if (d.getType() == MODE_ARROW) {
            canvas.drawLine(d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
            fillArrow(canvas, d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
        } else if (d.getType() == MODE_CIRCLE) {
            RectF oval2 = new RectF(d.getStartX(), d.getStartY(), d.getX(), d.getY());
            canvas.drawOval(oval2, d.getPair().second);
        } else if (d.getType() == MODE_RECTANGLE) {
            canvas.drawRect(d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
        } else if (d.getType() == MODE_ERASE) {
            canvas.drawPath(d.getPair().first, d.getPair().second);
        }
    }
    canvas.save();
}

onTouch Method

@Override
public boolean onTouch(View v, MotionEvent event) {                 
        mScaleDetector.onTouchEvent(event);
        mGestureDetector.onTouchEvent(event);
        PointF curr = new PointF(event.getX(), event.getY());

        mX = event.getX() + mDistX;
        mY = event.getY() + mDistY;

        if (state == State.NONE || state == State.DRAG || state == State.FLING) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawFlag = false;
                mStartX = mX;
                mStartY = mY;

                if (mMode == MODE_ARROW) {
                    mPath = new Path();
                    mLineDrawObject = new DrawObject(MODE_ARROW, new Pair<Path, Paint>(mPath, getLinePaint()));
                    drawFlag = true;
                } else if (mMode == MODE_TEXT) {
                    drawFlag = true;
                } else if (mMode == MODE_CIRCLE) {
                    mPath = new Path();
                    mCircleDrawObject = new DrawObject(MODE_CIRCLE, new Pair<Path, Paint>(mPath, getCirclePaint()));
                    drawFlag = true;
                } else if (mMode == MODE_RECTANGLE) {
                    mPath = new Path();
                    mRectangleObject = new DrawObject(MODE_RECTANGLE, new Pair<Path, Paint>(mPath, getRectanglePaint()));
                    drawFlag = true;
                } else if (mMode == MODE_DRAWING) {
                    mPath = new Path();
                    mDrawingDrawObject = new DrawObject(MODE_DRAWING, new Pair<Path, Paint>(mPath, getDrawPaint()));
                    drawFlag = true;
                } else if (mMode == MODE_ERASE) {
                    mPath = new Path();
                    mEraseObject = new DrawObject(MODE_ERASE, new Pair<Path, Paint>(mPath, getErasePaint()));
                    drawFlag = true;
                }
                if (drawFlag == true) {
                    touch_start(mX, mY);
                    invalidate();
                }

                last.set(curr);
                if (fling != null) {
                    fling.cancelFling();
                }
                setState(State.DRAG);
                break;

            case MotionEvent.ACTION_MOVE:
                if (state == State.DRAG && drawFlag == false) {
                    float deltaX = curr.x - last.x;
                    float deltaY = curr.y - last.y;
                    float fixTransX = getFixDragTrans(deltaX, viewWidth,
                            getImageWidth());
                    float fixTransY = getFixDragTrans(deltaY, viewHeight,
                            getImageHeight());
                    matrix.postTranslate(fixTransX, fixTransY);

                    fixTrans();
                    last.set(curr.x, curr.y);
                }
                if (drawFlag == true) {
                    touch_move(mX, mY);
                    invalidate();
                }
                break;

            case MotionEvent.ACTION_UP:
                if (drawFlag == true) {
                    touch_up();
                }
                break;
            case MotionEvent.ACTION_POINTER_UP:
                setState(State.NONE);
                break;

            }
        }

        setImageMatrix(matrix);
        //mCanvas.concat(matrix);

        //
        // User-defined OnTouchListener
        //
        if (userTouchListener != null) {
            userTouchListener.onTouch(v, event);
        }

        //
        // OnTouchImageViewListener is set: TouchImageView dragged by user.
        //
        if (touchImageViewListener != null) {
            touchImageViewListener.onMove();
        }

        //
        // indicate event was handled
        //
        return true;
    }
}

解决方案

You can try below onDraw and onTouch Method.

onDraw

 @Override
protected void onDraw(Canvas canvas) {
    onDrawReady = true;
    imageRenderedAtLeastOnce = true;
    if (delayedZoomVariables != null) {
        setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX, delayedZoomVariables.focusY, delayedZoomVariables.scaleType);
        delayedZoomVariables = null;
    }
    super.onDraw(canvas);
}

onTouch

@Override
    public boolean onTouch(View v, MotionEvent event) {
        mScaleDetector.onTouchEvent(event);
        mGestureDetector.onTouchEvent(event);
        PointF curr = new PointF(event.getX(), event.getY());

        if (state == State.NONE || state == State.DRAG || state == State.FLING) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(curr);
                    if (fling != null)
                        fling.cancelFling();
                    setState(State.DRAG);
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (state == State.DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float fixTransX = getFixDragTrans(deltaX, viewWidth, getImageWidth());
                        float fixTransY = getFixDragTrans(deltaY, viewHeight, getImageHeight());
                        matrix.postTranslate(fixTransX, fixTransY);
                        fixTrans();
                        last.set(curr.x, curr.y);
                    }
                    break;

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    setState(State.NONE);
                    break;
            }
        }

        setImageMatrix(matrix);

        //
        // User-defined OnTouchListener
        //
        if(userTouchListener != null) {
            userTouchListener.onTouch(v, event);
        }

        //
        // OnTouchImageViewListener is set: TouchImageView dragged by user.
        //
        if (touchImageViewListener != null) {
            touchImageViewListener.onMove();
        }

        //
        // indicate event was handled
        //
        return true;
    }
}

这篇关于触摸屏是根据缩放的图像不调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆