我正在尝试实现一个手势处理程序,允许用户以抛物线形状滑动(如果你单手滑动,手指的移动方式)。
我已经能够通过使用覆盖onDown
和onScroll
这样的方法来实现这一点:
public class MoveViewTouchListener
implements View.OnTouchListener
{
public GestureDetector mGestureDetector;
public View mView;
public double a;
public double b;
public double c;
public MoveViewTouchListener(View view,double a, double b, double c)
{
mGestureDetector = new GestureDetector(view.getContext(), mGestureListener);
mView = view;
this.a = a;
this.b = b;
this.c = c;
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
return mGestureDetector.onTouchEvent(event);
}
private GestureDetector.OnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener()
{
private float mMotionDownX, mMotionDownY;
@Override
public boolean onDown(MotionEvent e)
{
mMotionDownX = e.getRawX() - mView.getTranslationX();
mMotionDownY = e.getRawY() - mView.getTranslationY();
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
mView.setTranslationX(e2.getRawX() - mMotionDownX);
// Set the x translation
double x = mView.getTranslationX();
// Graphing quadratic (parabola)
// y = ax^2 + bx + c
double a = 0.00125;
double b = 0.0;
double c = 0.0;
//Converting that to code
double y = a*x*x + b*x + c;
Log.d("Chex ","X = " + x +", Y = " + y);
// Set the y translation
mView.setTranslationY((float)y);
return true;
}
};
}
基本上,对于x方向上的每个滚动事件,我都会在y方向上设置平移。
这很好用,并以抛物线(二次)形状滑动。但是当用户没有在屏幕上完全滑动时,我想将图标设置回动画回到开始位置(就像你没有完全滑动整个过程中的情况一样)。
我知道我需要使用MotionEvent.ACTION_UP
,但我不知道如何在我的情况下使用它,因为我正在onScroll
和onDown
进行更改。
答案 0 :(得分:1)
据我所知mGestureDetector
只处理事件,因为事件是由MoveViewTouchListener
委派的。
所以,如果事件是MoveViewTouchListener::onTouch()
,你不能简单地检查MotionEvent.ACTION_UP
:在这种情况下,不要调用mGestureDetector.onTouchEvent(event);
,而只是简单地为view
设置动画喜欢(例如:)
mView.animate()
.x(mViewInitialX)
.y(mViewInitialY)
.setDuration(200)
.start();
并返回true
。
它会变成类似
的东西@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.EVENT_UP) {
// go back to initial position
return true;
}
return mGestureDetector.onTouchEvent(event);
}