尊重原创:  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. android:shape属性详解

    这一类的shape定义在xml中 file location: res/drawable/filename.xml The filename is used as the resource ID.(这 ...

  2. Android简易实战教程--第二十二话《自定义组合控件模拟qq登录下拉框和其中的一些”小技巧”》

    转载此文章请注明出处:点击打开链接   http://blog.csdn.net/qq_32059827/article/details/52313516 首先,很荣幸此专栏能被CSDN推荐到主页.荣 ...

  3. Java中for_each循环的使用

    最近在看一些和安卓相关的书籍,看到了for_each这种循环结构,这是为了简化java的for循环而改造的一种方便使用的格式. 格式如下: for(数据类型 变量:集合) 语句块 接下来看一个例程: ...

  4. 17 ContentProvider

    1 Loader 转载器 Android3.0以后出来的 它可以使Activity和Fragment 异步加载数据 变得简单(Loader里封装了AsyncTask) 2 Loader特点: 对每一个 ...

  5. [ExtJS5学习笔记]第五节 使用fontawesome给你的extjs5应用增加字体图标

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/38458411本文作者:sushengmiyan-------------------- ...

  6. android 填满手机磁盘空间方法

    http://blog.csdn.net/fulinwsuafcie/article/details/9700619 很多时候我们需要进行临界测试. 譬如当手机盘空间存满的条件下应用会有何表现等. 之 ...

  7. 05 Activity知识

    1.Activity          >概念:活动面板   应用程序组件  可以绘制Ui界面  可以和用户进行交互     默认展示全屏  其他情况 界面比其他窗口小  悬浮在其他窗口上方   ...

  8. 安卓IPC机制之Binder详解

    IPC(Inter-Process Communication,跨进程通信)是指两个进程之间数据交换的过程,因此我们首先必须了解什么是进程,什么是线程. 进程:进程是正在运行的程序的实例,与程序相比, ...

  9. UNIX网络编程——UDP 中的外出接口的确定

    已连接UDP套接字还可用来确定用于特定目的地的外出接口.这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址.这个本地IP地址通过为目的IP地址搜索路由表得到外出接口, ...

  10. Integration between SharePoint 2013 and CRM 2013 (On-Premise)

    具体步骤可见下面的链接 https://community.dynamics.com/crm/b/msdynamicscrmtips/archive/2014/01/27/integration- ...