天天看点

Android开发秘籍学习笔记(十一)方法一:实现setOnTouchListener监听器方法二:构建手势探测器

  作为一个大学狗,前一个月为了一系列课程大作业和期末考试。所以暂停了博客的续写,从今天开始又开始了《Android开发秘籍》(第二版)的学习!在Android开发秘籍学习笔记(十)中学习了Android如何截取物理按键事件,今天就学习下如何监听滑动手势。

  在Android应用中,经常需要手势滑动操作,而处理手势滑动通常有两种方法:一种单独实现setOnTouchListener监听器来实现,另一种就是构建手势探测器。

方法一:实现setOnTouchListener监听器

myView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    mPosX = event.getX();
                    mPosY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    mCurPosX = event.getX();
                    mCurPosY = event.getY();

                    break;
                case MotionEvent.ACTION_UP:
                    if (mCurPosY - mPosY > 0
                            && (Math.abs(mCurPosY - mPosY) > 25)) {
                        //向下滑動
                        
                    } else if (mCurPosY - mPosY < 0
                            && (Math.abs(mCurPosY - mPosY) > 25)) {
                        //向上滑动
                        collapse();
                    }
                    
                    break;
                }
                return true;
            }

        });
    }
           

  可以看到,我们通过MotionEvent获取我们手触碰手机的坐标在获取到我们手移动结束后的坐标。再通过坐标变化判断我们到底是向哪个方向滑动。

方法二:构建手势探测器

  在本技巧中,将会有一个手势检测器(GestureDetector )来重写onTouchEvent(),以设置一个手势监听器。OnGestureListener接口可以响应的手势有以下几个。

  • onDown():当按下事件发生时发出通知。
  • onFling():当“按下并滑动一段距离再释放”这一事件发生后发出通知。
  • onLongPress():长按事件发生时发出通知。
  • onScroll():发生滚动时发出通知,
  • onShowPress():当按下时间在任何动作或释放之前发生时发出通知。
  • onSingleTapUp():当“按下后放开”事件发生时发出通知。  

如果只需要上述手势的一部分,可以继承SimpleOnGestureListener类。如果前面提到的任一方法没有显示地实现,他就会返回false。

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.widget.TextView;


public class MainActivity extends Activity {

    private static final int LARGE_MOVE = 60;
    private GestureDetector gestureDetector;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text_result);

        gestureDetector = new GestureDetector(this ,new SimpleOnGestureListener() {
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if(e1.getY() - e2.getY() > LARGE_MOVE){
                    textView.append("\nFling Up with velocity" + velocityY);
                }
                if(e2.getY() - e1.getY() > LARGE_MOVE){
                    textView.append("\nFling Down with velocity" + velocityY);
                }
                if(e1.getX() - e2.getX() > LARGE_MOVE){
                    textView.append("\nFling Left with velocity" + velocityX);
                }
                if(e2.getX() - e1.getX() > LARGE_MOVE){
                    textView.append("\nFling Right with velocity" + velocityX);
                }
                return false;
            }
        });
    }

    public boolean onTouchEvent(MotionEvent event){
        return gestureDetector.onTouchEvent(event);
    }
}
           

在布局文件中呢就定义了一个TextView,这里布局文件的代码就不给出了~ 效果展示:

Android开发秘籍学习笔记(十一)方法一:实现setOnTouchListener监听器方法二:构建手势探测器

 可以看到,这里同样是通过坐标的变化来判断到底是向哪个方向滑动,不过这里多了个参数velocity(速度)。