How to draw by finger on canvas after pinch to zoom coordinates changed in android?

旧街凉风 提交于 2019-12-06 04:14:52

After lots of research i found solution for moving actual canvas with finger and used ZoomControlButton for zoom in and zoom out canvas. I post my code here for someone help.

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

    if (isInEditMode()) {
        return;
    }

    if (mScaleFactor == 1.f)
    canvas.save();
    canvas.drawRGB(224, 224, 224);
    canvas.translate(-mPosX, -mPosY);
    canvas.drawBitmap(mLayerBitmap, new Matrix(), mDefaultPaint);

    Log.v("onDraw", "scale f : " + mScaleFactor);

    for (int i = 0; i < mCurrentOps.size(); i++) {
        Log.v("onDraw", "current ops");
        DrawOp current = mCurrentOps.valueAt(i);
        if (current != null) {
            current.draw(canvas);
        }
    }
    canvas.restore();
}

In onTouch() i used following code

@Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {

        final int pointerCount = MotionEventCompat.getPointerCount(event);

        switch (MotionEventCompat.getActionMasked(event)) {
        // switch(event.getAction()){
        // switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:
        // case MotionEventCompat.ACTION_POINTER_DOWN:
        {
            if (mFlagDrawing == true) {


                System.out.println("mFlagDrawing: " + mFlagDrawing);
                // Code for Zoom start
                // detector.onTouchEvent(event);
                mScaleDetector.onTouchEvent(event);
                // Code for Zoom finish

            } else if (mFlagDrawing == false) {
                System.out.println("mFlagDrawing: " + mFlagDrawing);

                float dx = event.getX();
                float dy = event.getY();

                if(mScaleFactor==1.f){
                    dx = event.getX() - mPosX;
                    dy = event.getY() - mPosY;
                }

                for (int p = 0; p < pointerCount; p++) {
                    final int id = MotionEventCompat.getPointerId(event, p);
                    DrawOp current = new DrawOp(mDefaultPaint);
                    current.getPath().moveTo(event.getX() + mPosX, event.getY() + mPosY);
                    mCurrentOps.put(id, current);
                }
            }
        }
            break;

        case MotionEvent.ACTION_MOVE: {

            // for(int p = 0; p < pointerCount; p++){

            if (mFlagDrawing == true) {

                System.out.println("mFlagDrawing: " + mFlagDrawing);
                // Code for Zoom start
                // detector.onTouchEvent(event);
                mScaleDetector.onTouchEvent(event);
                // Code for Zoom finish

            } else if (mFlagDrawing == false) {

                System.out.println("mFlagDrawing: " + mFlagDrawing);
                final int id = MotionEventCompat.getPointerId(event, 0);

                DrawOp current = mCurrentOps.get(id);

                final int historySize = event.getHistorySize();
                for (int h = 0; h < historySize; h++) {
                    x = event.getHistoricalX(h) + mPosX;
                    y = event.getHistoricalY(h) + mPosY;
                    current.getPath().lineTo(x, y);
                }
                x = MotionEventCompat.getX(event, 0) + mPosX;
                y = MotionEventCompat.getY(event, 0) + mPosY;
                current.getPath().lineTo(x, y);

                }
            }

            break;

        case MotionEvent.ACTION_UP:
            // case MotionEventCompat.ACTION_POINTER_UP:
            // {
            if (mFlagDrawing == true) {

                System.out.println("mFlagDrawing: " + mFlagDrawing);
                // Code for Zoom start
                // detector.onTouchEvent(event);
                mScaleDetector.onTouchEvent(event);
                // Code for Zoom finish
                mActivePointerId = INVALID_POINTER_ID;

            } else if (mFlagDrawing == false) {
                System.out.println("mFlagDrawing: " + mFlagDrawing);
                for (int p = 0; p < pointerCount; p++) {
                    final int id = MotionEventCompat.getPointerId(event, p);
                    mDrawOps.push(mCurrentOps.get(id));
                    mCurrentOps.remove(id);
                    // }
                    updateLayer();
                }
            }
            // }
            break;

        case MotionEvent.ACTION_CANCEL: {

            if (mFlagDrawing == true) {

                System.out.println("mFlagDrawing: " + mFlagDrawing);
                // Code for Zoom start
                // detector.onTouchEvent(event);
                mScaleDetector.onTouchEvent(event);
                // Code for Zoom finish
                 mActivePointerId = INVALID_POINTER_ID;
            } else if (mFlagDrawing == false) {
                System.out.println("mFlagDrawing: " + mFlagDrawing);
                for (int p = 0; p < pointerCount; p++) {
                    mCurrentOps
                            .remove(MotionEventCompat.getPointerId(event, p));
                }
            }
            // mFlagZoom = true;
            // }
        }
            break;

        default:
            return false;
        }

        invalidate();

        return true;
    }

When updating the whole Layer then i used following syntax:

private void updateLayer() {
        mLayerCanvas.drawColor(0, PorterDuff.Mode.CLEAR);

        mLayerCanvas.drawRGB(255,  255,  255);


        mLayerCanvas.save();

        for (DrawOp drawOp : mDrawOps) {
            if (drawOp != null) {
                drawOp.draw(mLayerCanvas);
            }
        }
        mLayerCanvas.restore();
        invalidate();
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!