终于进入到公司了,目前在做一个播放器的lib,需要用到手势识别,以前学过,但是忘得差不多了,现在再学习下,做个总结
在每个应用运行时,用户每次按下触摸屏幕在这个位置的view都会产生MotionEvent事件,该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。通过创建GestureDetector(手势识别)对象 ,然后用它的onTouchEvent可以转发这个MotionEvent对象至OnGestureListener,从而会触发一系列事件,调用一谢方法。
现在来做个测试,这个测试的大概情况是这样的,有一个textview,当我们左滑时,它上面的数字减少,右滑时数字增加。
来看代码:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private LinearLayout relativeLayout;
private GestureDetector gestureDetector;
private int progess=3306;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.test);
relativeLayout = (LinearLayout) findViewById(R.id.relativeLayout);
gestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (distanceX>0){
progess--;
}else {
progess++;
}
textView.setText(""+progess);
return super.onScroll(e1, e2, distanceX, distanceY);
}
});
relativeLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
boolean bool = gestureDetector.onTouchEvent(motionEvent);
return true;
}
});
// relativeLayout.setLongClickable(true);
}
}
可以看到,第一步,初始化view;
第二步,创建gestureDetector对象,并且重写它的监听事件中的onScroll方法,当左滑时减少,右滑时增加。
第三步,将relativeLayout的触发事件传递给gestureDetector。
这就可以达到我们想要的结果了。
在gestureDetector重写的事件中,
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
任何手势动作都会先执行一次按下(onDown)动作。
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。
在这儿有个问题,就是gestureDetector.onTouchEvent(motionEvent)返回的是false;
然后若在onTouch事件里将它的返回值直接return,是达不到效果的,就是滑动的时候数据不会变化,但是,在后面加这一句话时 relativeLayout.setLongClickable(true);就能达到效果了,所以要么return true;即按照上面的方法;要么
relativeLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return gestureDetector.onTouchEvent(motionEvent);
}
});
relativeLayout.setLongClickable(true);
这个不是太懂,望看懂的大神指教。