У меня возникли небольшие проблемы при попытке исправить ошибку в операции масштабирования и панорамирования моего холста. В настоящее время функциональность масштабирования и панорамирования работает в том смысле, что холст можно увеличивать или панорамировать, однако проблема заключается в том, что когда холст находится в состоянии панорамирования (изображение было панорамировано), и холст становится недействительным (когда экран коснулся снова, например, чтобы продолжить панорамирование) он возвращается к своим исходным координатам, а не продолжает панорамирование из предыдущего состояния. Для иллюстрации:
Допустим, это изображение, которое я хочу панорамировать.
Это изображение после панорамирования влево.
Это результат того, что я снова касаюсь экрана, чтобы продолжить панорамирование влево, как можно видеть, он снова возвращается к середине, тогда как я хочу, чтобы он оставался в состоянии панорамирования, которое было ранее, чтобы панорамирование могло продолжаться с этот момент. Ниже мой код:
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, ура!