zoukankan      html  css  js  c++  java
  • 8.滑动事件处理

    页签详情页.png
    上面是三个viewPager相互嵌套,这么就需要对滑动事件进行处理
    • 首先我们不需要viewpager1滑动,因为每次滑动的时候它的父控件就拦截了它的事件,侧边栏的每次滑的时候就跑了出来,所以这里是这样处理的:使用自定义viewpager,重写它的方法
    1. /**
    2. * 重写onTouchEvent事件,什么都不用做,不能滑动
    3. */
    4. @Override
    5. public boolean onTouchEvent(MotionEvent arg0) {
    6. return false;
    7. }
    • viewpager2在1里面,2想滑动,可是1却是不能滑动,把2的滑动事件拦截了,所以2也不能滑动了,这里还是重写1的自定义viewpager
    1. // 表示事件是否拦截, 返回false表示不拦截, 可以让嵌套在内部的viewpager相应左右划的事件
    2. @Override
    3. public boolean onInterceptTouchEvent(MotionEvent arg0) {
    4. return false;
    5. }
    接下来2使用自定义viewpager,在第一个页面的时候让父控件拦截,即显示出侧边栏,但是3的话是不拦截,让侧边栏不显示出来,这样的话就相互矛盾了,到底是拦截还是不拦截了?
    1. /**
    2. * 11个子页签水平滑动的Viewpager, 暂时不用
    3. *
    4. * @author Kevin
    5. *
    6. */
    7. public class HorizontalViewPager extends ViewPager {
    8. public HorizontalViewPager(Context context, AttributeSet attrs) {
    9. super(context, attrs);
    10. }
    11. public HorizontalViewPager(Context context) {
    12. super(context);
    13. }
    14. /**
    15. * 事件分发, 请求父控件及祖宗控件是否拦截事件
    16. */
    17. @Override
    18. public boolean dispatchTouchEvent(MotionEvent ev) {
    19. if (getCurrentItem() != 0) {
    20. getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求,
    21. // 不拦截
    22. } else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截
    23. getParent().requestDisallowInterceptTouchEvent(false);// 拦截
    24. }
    25. return super.dispatchTouchEvent(ev);
    26. }
    27. }

    所以不能按上面的第二步这样写,我们既想北京出来,又不想让北京出来
    修改:菜单详情页-新闻(viewpager1),以前是通过HorizontalViewPager 来控制,而上面图片的那个类也不能那样写了,看最后一个
    1. // mViewPager.setOnPageChangeListener(this);//注意:当viewpager和Indicator绑定时,
    2. // 滑动监听需要设置给Indicator而不是viewpager
    3. mIndicator.setOnPageChangeListener(this);
    1. @Override
    2. public void onPageSelected(int arg0) {
    3. System.out.println("onPageSelected:" + arg0);
    4. MainActivity mainUi = (MainActivity) mActivity;
    5. SlidingMenu slidingMenu = mainUi.getSlidingMenu();
    6. if (arg0 == 0) {//只有在第一个页面(北京), 侧边栏才允许出来
    7. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    8. } else {
    9. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
    10. }
    11. }

    • 接下写了indicate,可是发现indicate滑的时候会把侧边栏拉出来,因为侧边栏把它的滑动事件拦截了。修改indicate的源码TabPageIndicator.java
    1. /**
    2. * 事件分发, 请求父控件及祖宗控件不要拦截事件
    3. */
    4. @Override
    5. public boolean dispatchTouchEvent(MotionEvent ev) {
    6. getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求
    7. return super.dispatchTouchEvent(ev);
    8. }
    • viewpager3会滑到头或尾不能划了,可是我们不想要这种效果,自定义viewpager
    1. /**
    2. * 头条新闻的Viewpager
    3. */
    4. public class TopNewsViewPager extends ViewPager {
    5. int startX;
    6. int startY;
    7. public TopNewsViewPager(Context context, AttributeSet attrs) {
    8. super(context, attrs);
    9. }
    10. public TopNewsViewPager(Context context) {
    11. super(context);
    12. }
    13. /**
    14. * 事件分发, 请求父控件及祖宗控件是否拦截事件 1. 右划, 而且是第一个页面, 需要父控件(mainactivity)拦截,菜单就出来了 2. 左划, 而且是最后一个页面, 需要父控件(viewpager2)拦截,会滑动2的下一个页面
    15. * 3. 上下滑动, 需要父控件拦截
    16. */
    17. @Override
    18. public boolean dispatchTouchEvent(MotionEvent ev) {
    19. switch (ev.getAction()) {
    20. case MotionEvent.ACTION_DOWN:(滑动停止的时候)
    21. getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,
    22. // 这样是为了保证ACTION_MOVE调用
    23. startX = (int) ev.getRawX();
    24. startY = (int) ev.getRawY();
    25. break;
    26. case MotionEvent.ACTION_MOVE:(滑动的时候)
    27. int endX = (int) ev.getRawX();
    28. int endY = (int) ev.getRawY();
    29. if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
    30. if (endX > startX) {// 右划
    31. if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
    32. getParent().requestDisallowInterceptTouchEvent(false);
    33. }
    34. } else {// 左划
    35. if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
    36. // 需要拦截
    37. getParent().requestDisallowInterceptTouchEvent(false);
    38. }
    39. }
    40. } else {// 上下滑动
    41. getParent().requestDisallowInterceptTouchEvent(false);
    42. }
    43. break;
    44. default:
    45. break;
    46. }
    47. return super.dispatchTouchEvent(ev);
    48. }
    49. }
     MotionEvent中getX()和getRawX()的区别
    getX是获取以widget左上角为坐标原点计算的X轴坐标直.
    getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.
    当你触到按钮时,x,y是相对于该按钮左上点的相对位置。而rawx,rawy始终是相对于屏幕的位置。







  • 相关阅读:
    为什么一看编程技术文章就这么兴奋呢?
    今天弄会了如何使用VB6使用AutoCAD提供的dll操作AutoCAD了
    简单工厂模式没想像中的难啊
    Linq本质论,C#3.0的特性。写的太好了!收藏!
    struct和class的区别
    饿了
    解决Eclipse 3.3+lomboz无法启动的问题
    IE8通过Acid2了
    Linux档案/目录 权限及修改
    Linux 初识man、info
  • 原文地址:https://www.cnblogs.com/sixrain/p/4915737.html
Copyright © 2011-2022 走看看