一、目标。
将二十二节中通过滑动切换Activity界面效果的代码提取出来做成一个自定义抽象类,并定义抽象方法,便于其他类的调用。也就是其他Activity(如设置向导2、3、4)通过继承自定义的类,再通过实现其未实现的方法来快速实现滑动切换。
二、代码实现。
1、在程序包下新建一个类(取名SlideActivity),继承Activity,指定其类型为抽象类(public abstract class SlideActivity extends Activity)。在自定义的抽象类代码中,定义两个抽象方法(public abstract void),分别取名为slideNext()和slidePre(),表示滑向下一步和滑向上一步。该两个抽象方法让继承这个新建类的子类来实现。而现在在新建类里是为了根据滑动方向的结果来决定何时调用这两个抽象方法。
2、定义一个手势识别器(GestureDetector)对象(取名detector),复写onCreate方法。(以下步骤与二十二节相似,只是if语句中根据判断条件执行不同的抽象方法)在onCreate方法中实例化(new GestureDetector(context, listener)),参数context为上下文,listener为监听器。监听器通过new实例化,new的对象为SimpleOnGestureListener(){...}。在监听器中:
①.复写onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY),参数中MotionEvent e1表示手指落到屏幕上的事件, MotionEvent e2表示由目前动作所引起的移动事件, float velocityX、 float velocityY分别表示目前动作在x轴和y轴的移动速度。
②.获取手指落到屏幕上事件和移动事件所在的X轴坐标点(e2.getRawX() 、e1.getRawX()),通过if()...判断这两个坐标点的差值确定滑动方向。当e2所在的x轴坐标大于e1所在的x轴坐标,则手势是从左向右滑,此时调用滑向上一步(slidePre())的方法,当e1所在的x轴坐标大于e2所在的x轴坐标,则表示手势是从右向左滑,此时调用滑向下一步(slideNext())的方法。也可以用它们的差值大于某个值(如100)来判断,即只有滑动的距离超过该值时才会执行if里面的语句。
③.由于onFling方法的返回值类型是boolean,所以需要在if语句的最后均返回true。该方法的最后一个返回语句不更改。
3、在新建的抽象类代码里复写触摸事件方法onTouchEvent(MotionEvent event),参数MotionEvent event为当前触摸事件。在该方法里通过手势识别器(GestureDetector)对象(detector)的onTouchEvent(MotionEvent ev)方法,将当前触摸事件传入即可。
4、由于在之前制作“上一步”、“下一步”按钮样式时,将点击事件(pre(View view)、next(View view))均放在了样式里面,所以也可以将这两个点击事件在新建的抽象类(SlideActivity)中实现,其方法是分别执行滑向上一步(slidePre())和滑向下一步(slideNext())方法的语句。
新建抽象类(SlideActivity)的代码:
1 package com.example.mobilesafe; 2 3 import android.app.Activity; 4 import android.view.GestureDetector; 5 import android.view.GestureDetector.SimpleOnGestureListener; 6 import android.view.MotionEvent; 7 import android.view.View; 8 9 public abstract class SlideActivity extends Activity { 10 11 public abstract void slideNext(); 12 13 public abstract void slidePre(); 14 15 // 1、定义手势识别器 16 private GestureDetector detector; 17 18 @Override 19 protected void onCreate(android.os.Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 detector = new GestureDetector(this, new SimpleOnGestureListener() { 22 23 @Override 24 public boolean onFling(MotionEvent e1, MotionEvent e2, 25 float velocityX, float velocityY) { 26 if ((e2.getRawX() - e1.getRawX()) > 200) { 27 // 从左往右滑,滑至上一个页面 28 slidePre(); 29 return true; 30 } 31 if ((e1.getRawX() - e2.getRawX()) > 200) { 32 // 从右往左滑,滑至下一个页面 33 slideNext(); 34 return true; 35 } 36 return super.onFling(e1, e2, velocityX, velocityY); 37 } 38 }); 39 } 40 41 // 3、使用手势识别器 42 @Override 43 public boolean onTouchEvent(MotionEvent event) { 44 detector.onTouchEvent(event); 45 return super.onTouchEvent(event); 46 } 47 48 public void next(View view) { 49 slideNext(); 50 } 51 52 public void pre(View view) { 53 slidePre(); 54 } 55 56 }
5、让需要使用滑动切换界面的类继承上述新建的抽象类(SlideActivity),同时实现其未实现的两个方法(滑向上一步(slidePre())和滑向下一步(slideNext())。在这两个未实现的方法中,通过Intent和动画效果实现界面滑动切换。(注意,第一步中无上一步,所以在实现滑向上一步(slidePre())方法后,里面无需写代码。)