已经接触android四个月了,之前更多的是android的基础学习,在工作上也没有很多开发的工作,所以这几天有空学一下之前一直不懂的两个Activity左右滑动手势切换。根据经验,这个问题可以化解为两个问题,

第一:两个activity的跳转时的左右滑动效果如何实现

第二:手势操作的监听和实现

搞懂上面两个问题之后,只要监听手势操作,判断左滑还是右滑,然后触发相应的两个activity跳转效果就可以了。说起来容易,做起来。。。。。。。。。。。。。。。。。。。。。。。。。。。也很容易。

第一步如何实现两个activity的跳转时的左右滑动效果

就是Activity的调用内置方法

public void overridePendingTransition (int enterAnim, int exitAnim)

其中:

enterAnim 定义Activity进入屏幕时的动画
exitAnim 定义Activity退出屏幕时的动画
overridePendingTransition 方法必须在startActivity()或者 finish()方法的后面。

Android已经内置了几种动画效果,可以见 android.R.anim 类。一般情况下我们需要自己定义屏幕切换的效果。首先我们先了解Activity的位置定义,如下图:

android TabHost切换显示不一样的listview android两个activity切换_ide

从上图可以看出,以手机屏幕下面边未X轴,屏幕左边为Y轴,当Activity在X轴值为-100%p时,刚好在屏幕的左边(位置1),当X轴值为0%p时,刚好再屏幕内(位置2),当X=100%p时刚好在屏幕右边(位置3)。

清楚了位置后,我们就可以实现左右滑动的切换效果,首先让要退出的Activity从位置2移动到位置1,同时让进入的Activity从位置3移动位置2,这样就能实现从左右切换效果。

实现过程如下,首先定义2个动画,在 res目录创建anim目录, 然后在目录创建动画的xml文件:out_to_left.xml (从左边退出动画) 、

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="500"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />
</set>

in_from_right.xml(从右边进入动画)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="100%p"
        android:toXDelta="0%p" />

</set>

注: android:fromXDelta 动画开始的位置,  android:toXDelta 动画结束的位置, android:duration动画的时间。

假设有两个MainActivity和RightActivity,里面都有一个Button控件

然后接着就是在MainActivity通过Intent切换到RightActivity的时候调用上面这两个动画即可,因为我们暂时还不知道如何手势操作,所以采用Button触发,如何给Button加监听器我这里就不说了,给出点击MainActivity的Button按钮后触发的代码

Intent intent = new Intent();
        intent.setClass(this, RightActivity.class);
        startActivity(intent);
        // 设置切换动画,从右边进入,左边退出
        overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
Intent intent = new Intent();
        intent.setClass(this, RightActivity.class);
        startActivity(intent);
        // 设置切换动画,从右边进入,左边退出
        overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);

这样已经实现了MainActivity和RightActivity的切换,切换回来我就不说了怎么实现了,和上面的原理相同。

接下来如何实现手势的监听

首先声明一个GestureDetector类,你可以理解为将手势的监听器OnGestureListener和对象MainActivity结合起来,类似于给Button注册监听器,但还是不同。

首先创建一个GestureDetector对象

GestureDetector  detector = new GestureDetector(context, listener);
GestureDetector  detector = new GestureDetector(context, listener);

然后重写Activity的onTouchEvent方法

public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return detector.onTouchEvent(event);//这里用的detector就是上面创建的对象
    }
public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return detector.onTouchEvent(event);//这里用的detector就是上面创建的对象
    }

然后实现OnGestureListener中onFling方法

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        if ((e1.getX() - e2.getX()) > 50) {//说明是左滑
            Intent intent = new Intent();
            intent.setClass(this, RightActivity.class);
            startActivity(intent);
            // 设置切换动画,从右边进入,左边退出
            overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
            return true;
        } else
            return false;
    }
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        if ((e1.getX() - e2.getX()) > 50) {//说明是左滑
            Intent intent = new Intent();
            intent.setClass(this, RightActivity.class);
            startActivity(intent);
            // 设置切换动画,从右边进入,左边退出
            overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
            return true;
        } else
            return false;
    }

判断是左滑之后就触发第一部分学的页面切换的效果即可,如上述代码。右滑就不用说了吧。

备注:最好把两个Activity的launchMode变成singleTask,这样左右滑动用的都是第一个创建的实例,不会重复创建实例。