Android实例-手机安全卫士(二十二)-实现Activity界面滑动切换效果

一、目标。

  通过手指在屏幕上向左滑、向右滑动实现界面的动画效果切换(本节中以设置向导的第一个界面滑向第二个界面为例)。

二、代码实现。

  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     }
View Code

    ④.在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     }
View Code 

  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     }
View Code

 

posted @ 2015-01-29 14:36  红烧大白鲨  阅读(254)  评论(0编辑  收藏  举报