安卓中的手势操作我目前只用到了一种,就是滑动,向左滑,向右滑,向上向下滑,都能给与相应的处理,实现这种机制只要是靠GestureDetector类来实现。
1.new一个GestureDetecture对象
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
第一个参数是上下文,第二个是监听器,这里用的是这个类里面的一个适配器,就不用写监听器接口里的所有方法了,这里我只实现onFilling方法。第一个参数是初始点,第二个是停止点,计算他们的x,y距离判断是往哪边滑动的。
2.在适配器里面实现对应的方法。
3.重写onTouchEvent()触摸事件调用方法,加上
gestureDetector.onTouchEvent(event);
然后滑动的时候就会调用适配器中的操作了。
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if(Math.abs(e1.getRawY()-e2.getRawY())>100){
Toast.makeText(getApplicationContext(), "不能这么划", 0).show();
return true;
}
if((e2.getRawX()-e1.getRawX())>200) {
//往右划
Toast.makeText(getApplicationContext(), "向右滑", 0).show();
showPre();
return true;
}
if((e1.getRawX()-e2.getRawX())>200) {
//往左划
Toast.makeText(getApplicationContext(), "向左滑", 0).show();
showNext();
return true;
}
if(Math.abs(velocityX)<100) {
Toast.makeText(getApplicationContext(), "太慢了", 0).show();
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
增加:如果一个设置向导有4个界面,我们可以写四段这样相同的手势操作代码来实现,还有一个更好的设计的技巧,这也是我第一次在实际中用到了抽象类。
首先,我们点击下一步或者往左滑动都是可以进行下一步的,这样,不同点就是下一步这个方法的不同。
1.写一个BaseActivity继承Activity,写GestureDetecture,并定义好对应的方法
public abstract class BaseActivity extends Activity {
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if(Math.abs(e1.getRawY()-e2.getRawY())>100){
Toast.makeText(getApplicationContext(), "不能这么划", 0).show();
return true;
}
if((e2.getRawX()-e1.getRawX())>200) {
//往右划
Toast.makeText(getApplicationContext(), "向右滑", 0).show();
showPre();
return true;
}
if((e1.getRawX()-e2.getRawX())>200) {
//往左划
Toast.makeText(getApplicationContext(), "向左滑", 0).show();
showNext();
return true;
}
if(Math.abs(velocityX)<100) {
Toast.makeText(getApplicationContext(), "太慢了", 0).show();
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
public abstract void showPre();
public abstract void showNext();
public void pre(View view) {
showPre();
}
public void next(View view) {
showNext();
}
}
2.定义这个类为抽象类,写要子类实现抽象方法showPre()和showNext(),这样子类点击下一步的时候,是通过调用pre和next方法来实现的,而这两个方法是通过重写的方法实现的,我们在抽象类中已经定义了这两个方法,子类中就不用再写了,直接有;然后滑动的时候也是调用重写的方法来实现的,这样,每一个向导界面只要继承这个抽象类,实现其中的抽象方法,就能达到目的。
这中精彩的设计模式是我第一次遇到,真的很好!!!