作为一个大学狗,前一个月为了一系列课程大作业和期末考试。所以暂停了博客的续写,从今天开始又开始了《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,这里布局文件的代码就不给出了~ 效果展示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN4QTOwkTNyIDNxcDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
可以看到,这里同样是通过坐标的变化来判断到底是向哪个方向滑动,不过这里多了个参数velocity(速度)。