- 论坛徽章:
- 80
|
三、GestureDetector.OnDoubleTapListener---接口
1、构建
有两种方式设置双击监听:
方法一:新建一个类同时派生自OnGestureListener和OnDoubleTapListener:- private class gestureListener implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{
- }
复制代码 方法二:使用GestureDetector::setOnDoubleTapListener();函数设置监听:- //构建GestureDetector实例
- mGestureDetector = new GestureDetector(new gestureListener()); //使用派生自OnGestureListener
- private class gestureListener implements GestureDetector.OnGestureListener{
-
- }
- //设置双击监听器
- mGestureDetector.setOnDoubleTapListener(new doubleTapListener());
- private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
-
- }
复制代码 注意:大家可以看到无论在方法一还是在方法二中,都需要派生自GestureDetector.OnGestureListener,前面我们说过GestureDetector 的构造函数,如下:- GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
- GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
- GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
复制代码 可以看到,在构造函数中,除了后面要讲的SimpleOnGestureListener 以外的其它两个构造函数都必须是OnGestureListener的实例。所以要想使用OnDoubleTapListener的几个函数,就必须先实现OnGestureListener。
2、函数讲解:
首先看一下OnDoubleTapListener接口必须重写的三个函数:- private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
- public boolean onSingleTapConfirmed(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- public boolean onDoubleTap(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- public boolean onDoubleTapEvent(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- }
复制代码 onSingleTapConfirmed(MotionEvent e):单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。触发顺序是:OnDown->OnsingleTapUp->OnsingleTapConfirmed
关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。
onDoubleTap(MotionEvent e):双击事件
onDoubleTapEvent(MotionEvent e):双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件;下图是双击一下的Log输出:
两点总结:
1、从上图可以看出,在第二下点击时,先触发OnDoubleTap,然后再触发OnDown(第二次点击)
2、其次在触发OnDoubleTap以后,就开始触发onDoubleTapEvent了,onDoubleTapEvent后面的数字代表了当前的事件,0指ACTION_DOWN,1指ACTION_UP,2 指ACTION_MOVE
在上一个例子的基础上,我们再添加一个双击监听类,实现如下:- public class MainActivity extends Activity implements OnTouchListener{
- private GestureDetector mGestureDetector;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- mGestureDetector = new GestureDetector(new gestureListener()); //使用派生自OnGestureListener
- mGestureDetector.setOnDoubleTapListener(new doubleTapListener());
-
- TextView tv = (TextView)findViewById(R.id.tv);
- tv.setOnTouchListener(this);
- tv.setFocusable(true);
- tv.setClickable(true);
- tv.setLongClickable(true);
- }
-
-
- /*
- * 在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector
- * 来分析是否有合适的callback函数来处理用户的手势
- */
- public boolean onTouch(View v, MotionEvent event) {
- return mGestureDetector.onTouchEvent(event);
- }
-
- //OnGestureListener监听
- private class gestureListener implements GestureDetector.OnGestureListener{
- public boolean onDown(MotionEvent e) {
- Log.i("MyGesture", "onDown");
- Toast.makeText(MainActivity.this, "onDown", Toast.LENGTH_SHORT).show();
- return false;
- }
- public void onShowPress(MotionEvent e) {
- Log.i("MyGesture", "onShowPress");
- Toast.makeText(MainActivity.this, "onShowPress", Toast.LENGTH_SHORT).show();
- }
- public boolean onSingleTapUp(MotionEvent e) {
- Log.i("MyGesture", "onSingleTapUp");
- Toast.makeText(MainActivity.this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
- return true;
- }
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- Log.i("MyGesture22", "onScroll:"+(e2.getX()-e1.getX()) +" "+distanceX);
- Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_LONG).show();
-
- return true;
- }
- public void onLongPress(MotionEvent e) {
- Log.i("MyGesture", "onLongPress");
- Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_LONG).show();
- }
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- Log.i("MyGesture", "onFling");
- Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_LONG).show();
- return true;
- }
- };
-
- //OnDoubleTapListener监听
- private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
- public boolean onSingleTapConfirmed(MotionEvent e) {
- Log.i("MyGesture", "onSingleTapConfirmed");
- Toast.makeText(MainActivity.this, "onSingleTapConfirmed", Toast.LENGTH_LONG).show();
- return true;
- }
- public boolean onDoubleTap(MotionEvent e) {
- Log.i("MyGesture", "onDoubleTap");
- Toast.makeText(MainActivity.this, "onDoubleTap", Toast.LENGTH_LONG).show();
- return true;
- }
- public boolean onDoubleTapEvent(MotionEvent e) {
- Log.i("MyGesture", "onDoubleTapEvent");
- Toast.makeText(MainActivity.this, "onDoubleTapEvent", Toast.LENGTH_LONG).show();
- return true;
- }
- };
- }
复制代码 双击一下,部分截图如下:
双击所对应的触发事件顺序:
轻轻单击一下,对应的事件触发顺序为:
|
|