Android Studio, как продолжить панорамирование холста из ранее панорамированного состояния - PullRequest
0 голосов
/ 26 марта 2019

У меня возникли небольшие проблемы при попытке исправить ошибку в операции масштабирования и панорамирования моего холста. В настоящее время функциональность масштабирования и панорамирования работает в том смысле, что холст можно увеличивать или панорамировать, однако проблема заключается в том, что когда холст находится в состоянии панорамирования (изображение было панорамировано), и холст становится недействительным (когда экран коснулся снова, например, чтобы продолжить панорамирование) он возвращается к своим исходным координатам, а не продолжает панорамирование из предыдущего состояния. Для иллюстрации:

enter image description here

Допустим, это изображение, которое я хочу панорамировать.

enter image description here

Это изображение после панорамирования влево.

enter image description here

Это результат того, что я снова касаюсь экрана, чтобы продолжить панорамирование влево, как можно видеть, он снова возвращается к середине, тогда как я хочу, чтобы он оставался в состоянии панорамирования, которое было ранее, чтобы панорамирование могло продолжаться с этот момент. Ниже мой код:

private final static float mMinZoom = 1.f;
private final static float mMaxZoom = 3.f;
private float mScaleFactor = 1.f;
private ScaleGestureDetector mScaleGestureDetector;
private final static int NONE = 0;
private final static int PAN = 1;
private final static int ZOOM = 1;
private int mEventState;
private float mStartX = 0;
private float mStartY = 0;
private float mTranslateX = 0;
private float mTranslateY = 0;

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{
    @Override
    public boolean onScale(ScaleGestureDetector detector){
        mScaleFactor *= detector.getScaleFactor();
        mScaleFactor = Math.max(mMinZoom, Math.min(mMaxZoom,mScaleFactor));
        //invalidate();
        //requestLayout();
        return super.onScale(detector);
    }
}

public DrawGraphTest(Context context) {
    super(context);
    init();
}

public DrawGraphTest(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    init();
    mScaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleListener());
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction() & MotionEvent.ACTION_MASK){
        case MotionEvent.ACTION_DOWN:
            mEventState = PAN;
            mStartX = event.getX();
            mStartY = event.getY();
            Log.d("coordinates", String.valueOf(event.getX() / mScaleFactor));
            break;
        case MotionEvent.ACTION_UP:
            mEventState = NONE;
            break;
        case MotionEvent.ACTION_MOVE:
            mTranslateX = event.getX() - mStartX;
            mTranslateY = event.getY() - mStartY;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            mEventState = ZOOM;
            break;
    }
    mScaleGestureDetector.onTouchEvent(event);
    if((mEventState == PAN && mScaleFactor != mMinZoom) || mEventState == ZOOM){
        invalidate();
        requestLayout();
    }
    return true;
}

private void init() {
    //Various paints and such
}

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

    canvas.save();
    canvas.scale(mScaleFactor,mScaleFactor);
    canvas.translate(mTranslateX / mScaleFactor, mTranslateY /mScaleFactor);

    //Draw various stuff to canvas
    //.....
    canvas.restore();
}

Любая помощь с этим будет принята с благодарностью, так как я очень плохо знаком с Android Studio, ура!

...