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

    博客分类:
  • Android
Android velocity SNS

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

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

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

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

Java代码 收藏代码
  1. publicclassViewSnsActivityextendsActivityimplementsOnTouchListener,OnGestureListener

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

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

Java代码 收藏代码
  1. GestureDetectormGestureDetector;
Java代码 收藏代码
  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.view_sns_activity);
  4. mGestureDetector=newGestureDetector((OnGestureListener)this);
  5. LinearLayoutviewSnsLayout=(LinearLayout)findViewById(R.id.viewSnsLayout);
  6. viewSnsLayout.setOnTouchListener(this);
  7. viewSnsLayout.setLongClickable(true);
  8. }

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

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

3、重载onFling函数

Java代码 收藏代码
  1. privateintverticalMinDistance=20;
  2. privateintminVelocity=0;
  3. publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){
  4. if(e1.getX()-e2.getX()>verticalMinDistance&&Math.abs(velocityX)>minVelocity){
  5. //切换Activity
  6. //Intentintent=newIntent(ViewSnsActivity.this,UpdateStatusActivity.class);
  7. //startActivity(intent);
  8. Toast.makeText(this,"向左手势",Toast.LENGTH_SHORT).show();
  9. }elseif(e2.getX()-e1.getX()>verticalMinDistance&&Math.abs(velocityX)>minVelocity){
  10. //切换Activity
  11. //Intentintent=newIntent(ViewSnsActivity.this,UpdateStatusActivity.class);
  12. //startActivity(intent);
  13. Toast.makeText(this,"向右手势",Toast.LENGTH_SHORT).show();
  14. }
  15. returnfalse;
  16. }

OnFling的四个参数意思分别为

Xml代码 收藏代码
  1. e1Thefirstdownmotioneventthatstartedthefling.手势起点的移动事件
  2. e2ThemovemotioneventthattriggeredthecurrentonFling.当前手势点的移动事件
  3. velocityXThevelocityofthisflingmeasuredinpixelspersecondalongthexaxis.每秒x轴方向移动的像素
  4. velocityYThevelocityofthisflingmeasuredinpixelspersecondalongtheyaxis.每秒y轴方向移动的像素

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

Java代码 收藏代码
  1. if(e1.getX()-e2.getX()>verticalMinDistance&&Math.abs(velocityX)>minVelocity)

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

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

4、重载onTouch函数

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

Java代码 收藏代码
  1. publicbooleanonTouch(Viewv,MotionEventevent){
  2. returnmGestureDetector.onTouchEvent(event);
  3. }

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

其他:

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

更多相关文章

  1. Android碎碎念 -- 性能测试,适用于Android Studio的代码审查和性
  2. 对系统学习与写博客的看法——学完《第一行代码》有感
  3. Android开发——纯JAVA代码方式界面设计
  4. GDB调试Android代码——环境搭建及调试过程
  5. 【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附De
  6. 如何在代码中为组件设置dip,sp值
  7. Android实战技巧之四十五:复用原有C代码的方案
  8. 这本《第三行代码》,让大家久等了!
  9. 《第一行代码Android》读书笔记

随机推荐

  1. android 使用Intent传递数据之静态变量
  2. android:onClick都做了什么
  3. Google Android开发精华教程
  4. textView 属性总结
  5. android 图片浏览功能 图片放大缩小 使用
  6. Tabhost中Activity绑定Service
  7. AutoCompleteTextView(自动完成文本框)
  8. android bluetooth
  9. android EditText 的键盘弹出(不弹出)坑爹
  10. Android中的Binder机制一(实名Binder)