一、目标。
通过手指在屏幕上向左滑、向右滑动实现界面的动画效果切换(本节中以设置向导的第一个界面滑向第二个界面为例)。
二、代码实现。
1、定义手势识别器(GestureDetector)对象,并在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轴坐标,则手势是从左向右滑,当e1所在的x轴坐标大于e2所在的x轴坐标,则表示手势是从右向左滑。也可以用它们的差值大于某个值(如100)来判断,即只有滑动的距离超过该值时才会执行if里面的语句。另外判断这两点Y轴的差值的绝对值大小和x轴滑动速度的绝对值的大小来限制斜滑、慢滑等条件)
③.由于onFling方法的返回值类型是boolean,所以需要在if语句的最后均返回true。该方法的最后一个返回语句不更改。
手势识别器(GestureDetector)对象建立代码:
1 private GestureDetector detector; 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_setupwizard_ui1); 7 detector = new GestureDetector(this, new SimpleOnGestureListener() { 8 9 @Override 10 public boolean onFling(MotionEvent e1, MotionEvent e2, 11 float velocityX, float velocityY) { 12 if ((e2.getRawX() - e1.getRawX()) > 200) { 13 // 从左往右滑,滑至上一个页面 14 return true; 15 } 16 if ((e1.getRawX() - e2.getRawX()) > 200) { 17 // 从右往左滑,滑至下一个页面 18 slideNext(); 19 return true; 20 } 21 return super.onFling(e1, e2, velocityX, velocityY); 22 } 23 }); 24 }
④.在if语句中通过Intent和动画效果实现Activity界面切换。由于此时的界面切换的代码与onClick点击事件的实现代码一致,因此可以重新定义一个方法(取名slideNext()),在该方法里面实现界面的动画切换效果,并在if语句里和next(View view)点击事件方法里执行该新建的方法。但是不能在if语句里面调用next(View view)点击事件方法,因为无对象可以传入。
新建的slideNext()方法代码:
1 public void slideNext() { 2 Intent intent = new Intent(SetupWizard_ui_1.this, 3 SetupWizard_ui_2.class); 4 startActivity(intent); 5 finish(); 6 // 要求在finish()或startActivity(intent)后面执行。 7 overridePendingTransition(R.anim.tran_in, R.anim.tran_out); 8 }
2、在onCreate方法里复写触摸事件方法onTouchEvent(MotionEvent event),参数MotionEvent event为当前触摸事件。在该方法里通过手势识别器(GestureDetector)对象(detector)的onTouchEvent(MotionEvent ev)方法,将当前触摸事件传入即可。
触摸事件方法代码:
1 // 复写触摸事件方法 2 @Override 3 public boolean onTouchEvent(MotionEvent event) { 4 detector.onTouchEvent(event); 5 return super.onTouchEvent(event); 6 }