TabActivity实现手指左右滑动切换页面

来源:互联网 发布:剑三男神脸数据下载 编辑:程序博客网 时间:2024/04/30 12:12

在做项目的时候主界面有好几个tab, 有些用户习惯性的左右滑屏来切换tab,所以添加了左右滑屏切换他变得功能。

基本思想:

dispatchTouchEvent在接收到用户触屏时间之后被触发,所在在dispatchTouchEvent中获取当前用户事件,判断是滑动,则执行切换tab,并且终止当前触屏事件。否则则正常流程。

实现方式:

private GestureDetector gestureDetector; // 用户滑动

gestureDetector = new GestureDetector(new TabHostTouch());


private int flaggingWidth;// 互动翻页所需滚动的长度是当前屏幕宽度的1/3

// 获取分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
flaggingWidth = dm.widthPixels / 3;

[java] view plaincopy
  1. private class TabHostTouch extends SimpleOnGestureListener {  
  2.         @Override  
  3.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  4.                 float velocityY) {  
  5.             if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY()  
  6.                     - e2.getY())  
  7.                     && (e1.getX() - e2.getX() <= (-flaggingWidth) || e1.getX()  
  8.                             - e2.getX() >= flaggingWidth)) {  
  9.                 if (e1.getX() - e2.getX() <= (-flaggingWidth)) {  
  10.                     currentTabID = mTabHost.getCurrentTab() - 1;  
  11.                     if (currentTabID < 0) {  
  12.                         currentTabID = mTabHost.getTabCount() - 1;  
  13.                     }  
  14.                     mTabHost.setCurrentTab(currentTabID);  
  15.                     return true;  
  16.                 } else if (e1.getX() - e2.getX() >= flaggingWidth) {  
  17.                     currentTabID = mTabHost.getCurrentTab() + 1;  
  18.                     if (currentTabID >= mTabHost.getTabCount()) {  
  19.                         currentTabID = 0;  
  20.                     }  
  21.                     mTabHost.setCurrentTab(currentTabID);  
  22.                     return true;  
  23.                 }  
  24.             }  
  25.             return false;  
  26.         }  
  27.     }  

override dispatchTouchEvent

[java] view plaincopy
  1. @Override  
  2. public boolean dispatchTouchEvent(MotionEvent event) {  
  3.   
  4.     if (gestureDetector.onTouchEvent(event)) {  
  5.         event.setAction(MotionEvent.ACTION_CANCEL);  
  6.     }  
  7.     return super.dispatchTouchEvent(event);  
  8.   
  9. }  

在写好了tab,之后修订的功能,所以只是为了实现这个功能而实现。

应该是可以直接用ViewPager实现这个效果的。

 

~~~~~~~~

 

android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:

1)public boolean dispatchTouchEvent(MotionEvent ev)          这个方法用来分发TouchEvent

2)public boolean onInterceptTouchEvent(MotionEvent ev)         这个方法用来拦截TouchEvent

3)public boolean onTouchEvent(MotionEvent ev)                 这个方法用来处理TouchEvent

注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。


转载地址:http://blog.csdn.net/actual_/article/details/8000359


0 0