`

Android 滑动切换页面 以及屏幕手势

阅读更多

手机进入智能机时代,触摸屏也已成为主流之势,原来的手机按键也被屏幕点触取代,滑动屏幕操作则相对屏幕点击更能获得用户的青睐,习惯了各种浏览器的鼠标手势、pad等平板的切滑、类似iReader的软件丰富的手势后,是不是也想自己的软件能够用食指炫起来呢,下面就让我们来看看android的手势操作吧

 

先介绍下左右滑动切换Activity,对于复杂的手势原理一样,具体后述。

主要原理为监控触屏事件和手势事件,在触屏事件处理函数中调用手势事件处理函数,表示用户触屏后是否有手势操作,有则进行手势事件处理,大致分为四步

 

1、需要继承OnGestureListener和OnDoubleTapListener,如下:

public class ViewSnsActivity extends Activity implements OnTouchListener, OnGestureListener

这两个类分别是触屏监听器和手势监控器,具体可查看OnTouchListenerOnGestureListener

 

2、在添加mGestureDetector的定义,并在ViewSnsActivity的onCreate函数中加入其页面布局的setOnTouchListener事件

GestureDetector mGestureDetector;

  

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_sns_activity);
        
        mGestureDetector = new GestureDetector((OnGestureListener) this);  
        LinearLayout viewSnsLayout = (LinearLayout)findViewById(R.id.viewSnsLayout);  
        viewSnsLayout.setOnTouchListener(this);  
        viewSnsLayout.setLongClickable(true);  
    }

mGestureDetector为手势监听对象,下面的OnFling就是为其实现,用来处理手势的

viewSnsLayout.setOnTouchListener(this);表示viewSnsLayout这个layout的触屏事件由下面的OnTouch处理

 

3、重载onFling函数

    private int verticalMinDistance = 20;
    private int minVelocity         = 0;

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        if (e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {

            // 切换Activity
            // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
            // startActivity(intent);
            Toast.makeText(this, "向左手势", Toast.LENGTH_SHORT).show();
        } else if (e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {

            // 切换Activity
            // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
            // startActivity(intent);
            Toast.makeText(this, "向右手势", Toast.LENGTH_SHORT).show();
        }

        return false;
    }

OnFling的四个参数意思分别为

e1	The first down motion event that started the fling.手势起点的移动事件
e2	The move motion event that triggered the current onFling.当前手势点的移动事件
velocityX	The velocity of this fling measured in pixels per second along the x axis.每秒x轴方向移动的像素
velocityY	The velocity of this fling measured in pixels per second along the y axis.每秒y轴方向移动的像素

说的更简单点就是,鼠标手势相当于一个向量(当然有可能手势是曲线),e1为向量的起点,e2为向量的终点,velocityX为向量水平方向的速度,velocityY为向量垂直方向的速度

if (e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity)

 则上面的语句能知道啥意思了吧,就是说向量的水平长度必须大于verticalMinDistance,并且水平方向速度大于minVelocity

 

从而我们可以如此判断手势是否满足一定的条件从而进行相应响应,也可以根据这个写出更复杂的手势判断。

 

4、重载onTouch函数

在2中我们定义了viewSnsLayout的touch事件处理,下面我们来实现,直接调用手势的处理函数

	public boolean onTouch(View v, MotionEvent event) {
		return mGestureDetector.onTouchEvent(event);
	}

查看GestureDetector类的onTouchEvent的源码就能知道,进入该函数后会进入case MotionEvent.ACTION_UP这个路径,从而调用onFling函数

 

如果需要设置activity切换效果,在startActivity(intent);之后添加

overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);即可,可修改相应参数,可参考http://www.iteye.com/topic/1116472

 

其他:

关于activity添加ScrollView后或是外部为RelativeLayout时onFling不起作用,无法滑动问题见http://trinea.iteye.com/blog/1213815

 

 
 
分享到:
评论
8 楼 Mr1964 2013-05-19  
谢谢LZ,真棒,可以用。哈哈
7 楼 Trinea 2012-02-06  
335062868 写道
请问楼主,当其中一个activity有listview上下滚动的时候,这个左右切换效果就失效了,有什么办法避免吗?

你可以参考下http://trinea.iteye.com/blog/1213815 这个
6 楼 335062868 2012-02-05  
请问楼主,当其中一个activity有listview上下滚动的时候,这个左右切换效果就失效了,有什么办法避免吗?
5 楼 Trinea 2011-12-29  
error_lei 写道
import android.view.GestureDetector.OnGestureListener;

这种控件相关的一般都在android.view下面,再加上eclipse的提示可以自己加进来
4 楼 error_lei 2011-12-29  
import android.view.GestureDetector.OnGestureListener;
3 楼 error_lei 2011-12-29  
OnGestureListener这个类是那个包下的啊
2 楼 hautbbs 2011-12-28  
顶起。
1 楼 qaz695632145 2011-11-25  
顶下

相关推荐

Global site tag (gtag.js) - Google Analytics