尊重原创:  http://blog.csdn.net/sk719887916/article/details/40043961 skay

想必大家都遇到过手势和焦点的问题   对于安卓初学者或者初次入职的开发人员或许是比较难的话题。

项目举例  如下图

需求:

图片是放在viewpager里面 实现轮播效果, 用户也可以左右滑动图片, 标题栏左右是个按钮 左边是更多 右边菜单 。

如果手指不在图片上,我们滑动屏幕默认是下方四个tab切换,到达最后一个(房子)弹出右边菜单,滑到第一个(五角星)弹出左边的侧滑菜单。

当手指处在图片时,我们滑动屏幕则需要是图片切换。

上图采用两个ViewPager+slidingmenu+ Fragment实现。广告Baner,也就是我们的ImageView所处的小的ViewPager,需要实现左右切换,整个首页的第一个Fragmen处在大的ViewPager中,那么这时候就会出现焦点混乱问题。

很多初次使以上两功能的人多会遇到这种问题 :比如我手在滑动图片上的时候 居然侧滑菜单出来了 而我们的想法是滑动查看图片 那么怎么做呢

先区分View和SlidingMenu:

我们给viewpager设置滑动监听OnPageChangeListener 我们可以自定义去实现此监听 关键代码如下

@Override
public void onPageSelected(int position) {
int lastPostion =adapter.getCount() - 1;
if (position == 0) {
((SlidingFragmentActivity) activity). getSlidingMenu().setMode(SlidingMenu.LEFT); // 第一个。SlidingMenu仅有左边有效
((SlidingFragmentActivity) getActivity()).  getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
               ;
            }
else if (position == lastPostion) {
/* ((SlidingFragmentActivity) activity).   getSlidingMenu().setMode(SlidingMenu.RIGHT); // 最后一个。SlidingMenu仅有右边有效
*/ ((SlidingFragmentActivity) activity).   getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
           }
            else {  

            ((SlidingFragmentActivity) activity).  getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);// 中间,SlidingMenu无效 只有边沿有效
            }
}

此方法就可以屏蔽slidingmenu抢焦点问题  现在就可以去试试了 搞定

区分大ViewPager和小ViewPager :

为了便于我们区分,给外层的ViewPager称之为FragmentVP, 小的ViewPager命名为ImageVP,如果对安卓时间不熟悉的请移步可以参考焦点事件文章 安卓Tv开发(一)焦点控制(触控事件),

那么抛开技术问题,我们首先想到:

1  当ImageVP可见,也就是滑到第一个Tab所指的Fragment时,我们需要获取图片的所在矩形范围。

2 当手指触摸范围在我们的矩形范围时,需要获得焦点,也就是主动要求焦点(requstFroce.

3 当手指触摸的位置不在图片的范围的,我们需要让FragmentVP获得焦点。

以上也只是初学者的理解,但是当我们真的代码这么去做的时候,发现上面方式无效,随之蛋疼的无法在蛋疼,于是楼主加了三天半还没搞定,最后阅读了事件源码,才发现原来罪魁祸首在于它。

理解了事件源码的朋友都知道,当我们手指按在图片上时,首先由最外层所处的Activity收到事件,以此分发传递到我们的图片上,那么这个时间在哪里被拦截了,也就是所消费了,我不断追踪断点,最后发现,原来再我们的最外层的FragmentVP所不在传递,由他的执行onTouchEvent()消费了。

1 )重写FragmentVP 的onInterceptTouch()不让拦截事件,具体我们返回fasle即可,

PS: 这里需要你做下if判断,所处手指在imageView上我们不拦截,反之拦截

2)当然到这里还不行,因为此时还会触发FragmentVP 的dispathTouchEvent(),还需要重载此方法,返回true,意思就是继续往下传递,具体事件原理请阅读上面的文章,这里只给出解决方法,

Ps:这里需要你做下if判断,所处手指在imageView上我们传递,反之不传递

3 我们还要去重写ImageVP的onTouchEvent()方法,让他消费此事件,具体我们返回true即可,

有了思路写起来很易,代码就不在贴了,谢谢阅读。

Android ViewPager和Slidingmenu手势冲突问题的更多相关文章

  1. 备忘-Android ViewPager 与Gallery滑动冲突解决方法

    解决方法,重新定义gallery,禁止触发pager的触摸事件 1 public class UserGallery extends Gallery implements OnGestureListe ...

  2. Android ViewPager 里有子ViewPager的事件冲突

    在Android应用中有时候要用到类似网易新闻左右滑动页面且页面里又有左右滑动的图片功能,我不知道网易是怎么实现的,本人的做法是外面的BaseFragmentActivity布局就是TabViewPa ...

  3. 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?

    有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...

  4. Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案

    为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...

  5. Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突?

    DrawerLayout 是 Android 官方的侧滑菜单控件,而 ViewPager 相信大家都很熟悉了.今天这里就讲一下当在 DrawerLayout 中嵌套 ViewPager 时,要如何解决 ...

  6. xamarin android viewpager的用法

    1.什么是ViewPager 通过手势滑动可以完成view的切换,一般是用来app的引导页或则实现图片轮播,类似网页上的banner轮播. Adnroid 3.0后引入的一个UI控件,在xamarin ...

  7. 拖拽手势和清扫手势冲突时(UIPanGestureRecognizer和UISwipeGestureRecognizer冲突时)

    故事发生在这样的情境上:给整个控制器添加了一个拖拽手势,然后又在控制上的每个Cell上加了左滑清扫手势,然后问题来了:只有拖拽手势起作用,而左滑手势没有效果了,然后怎么解决这个问题呢!先上图: 当给整 ...

  8. Android ViewPager 用法

    Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...

  9. Android ViewPager再探:增加滑动指示条

    上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...

随机推荐

  1. EBS总账(GL)模块常用表

     select * from gl_sets_of_books 总帐 select * from gl_code_combinations gcc wheregcc.summary_flag='Y ...

  2. Mybatis源码分析之存储过程调用

    这一篇博客我们学习一下Mybatis调用存储过程的使用和运行流程.首先我们先创建一个简单的存储过程 DELIMITER $ CREATE PROCEDURE mybatis.ges_user_coun ...

  3. Android Paint类介绍以及浮雕和阴影效果的设置

    Paint类介绍 Paint即画笔,在绘制文本和图形用它来设置图形颜色, 样式等绘制信息. 1.图形绘制 setARGB(int a,int r,int g,int b); 设置绘制的颜色,a代表透明 ...

  4. linux qcom LCD framwork

    点击打开链接 0.关键字 MDSS : Multimedia Display sub system DSI: Display Serial Interface 1.涉及文件 (1) drivers\v ...

  5. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  6. SDL2源代码分析8:视频显示总结

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  7. iOS中 static变量与全局、局部变量的区别 !

    static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并 ...

  8. HTML5 Web Storage 特性

    原文地址: Using HTML5 Web Storage 原文日期: 2010年06月28日 翻译日期: 2013年08月12日 当下Web开发领域最火爆的词语当属 HTML5.HTML5标准的新特 ...

  9. Linux Debugging(一): 使用反汇编理解C++程序函数调用栈

    拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了.GDB也是使用函数的调用栈去还原"事故现场"的.因此理解函数调用栈,是使用GDB进行现场 ...

  10. 【Linux命令】netcat 网络工具的瑞士军刀

    netcat被成为网络工具中的瑞士军刀,之前也没怎么用过,挺惭愧的,那么现在来看看怎么用吧. udp 和 tcp协议都比较好使,至少在测udp的时候,使用telnet感觉很无力呀.(nc 和 netc ...