目的:android应用程序添加手势识别,从左向右滑动,弹出对话框。
原理:当手机被触摸时,首先触发一个MotionEvent事件,该事件被OnTouchListener监听,在起OnTouch( View view, MotionEvent event )方法中获得该事件. 该事件中
封装了很多信息,包括手机被触摸的点,被触摸的时间长度,触摸的类型(单击,短按,长按,活动)等。然后该事件通过GestureDetector(手势识别器),传递给OnGestureListener接口处理, 最后OnGestureListener根据封装的信息,做出相应的处理。
实现过程:
Part1: 创建Listener
1. 创建一个接口OnSwipeTouchListener,其实现OnTouchListener接口。
2.在OnSwipeTouchListener中,定义private, GestureDetectorl类型的变量mgestureDetector,用于接受触摸传进来的MotionEvent事件,并且并且为该对象指定一个接口
OnGestureListener()来处理。
2.1 接口OnGestureListener继承类SimpleOnGestureListener2.2 在接口OnGestureListener中,定义了函数onDown( MotionEvent e)和onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
2.3当MotionEven传进来的时,会调用函数OnFling()处理
2.4在函数OnFling()中,根据手势的不同,调用不同的OnSwipeTouchListener()中的函数onSwipeRight(),onSwipeLeft()onSwipeTop(),
tonSwipeDown()进行处理.
3. OnSwipeTouchListener中,先定义上次四个函数,内容为空。
4.OnSwipeTouchListener中,复写函数onTouch(View arg0, MotionEvent event),将传进来的MotionEven传到前面定义的GestureDetector对象中, 该
GestureDetector对象接受到事件后,会调用接口函数处理。
package com.example.drawer_test;
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AdapterView.OnItemClickListener;
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector mgestureDetector; //手势识别器
public OnSwipeTouchListener(Context Ctx){
mgestureDetector = new GestureDetector( Ctx, new OnGestureListener() );
}
public class OnGestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
public boolean onDown(MotionEvent e) {
return true;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
return mgestureDetector.onTouchEvent(event);
}
}
Part2: 为Activity添加listener, 在onCreat()函数中
1.创建AlertDialog
2. 实例化接口OnSwipeTouchListener, 并且复写对应的函数onSwipeRight(),onSwipeLeft()onSwipeTop(), onSwipeDown().
3. 为Activity添加listener
<span style="white-space:pre"> </span>//Initialize an AlertDialog
<span style="white-space:pre"> </span>final AlertDialog.Builder mDialogShow = new Builder(this);
mDialogShow.setTitle("SwipeTop").setMessage("SwipeTop").setPositiveButton("是", null);
//prepare gesture detector
mSwipeTouchListener = new OnSwipeTouchListener(this){
public void onSwipeTop(){
setTitle("SwipeTOP");
mDialogShow.create().show();
}
<span style="white-space:pre"> </span>};
findViewById(R.id.content_frame).setOnTouchListener(mSwipeTouchListener);</span>//添加Listener