项目中首页是用viewpager+fragment集成的,第一个fragment有广告轮播图使用viewpager实现的,开始就遇到是广告图无法手动滑动,事件被外层的viewpager拦截响应切换到下一个fragment了。想到是事件分发的问题,但是自己并不是很熟悉……在网上找了些方法,并且解决了这个问题,记录下来供学习。感谢作者分享!

原文连接:http://bbs.9ria.com/thread-248286-1-1.html

重写子viewpager:

view sourceprint?01public class ChildViewPager extends ViewPager{
   /** 触摸时按下的点 **/
   PointF downP = new PointF();
   /** 触摸时当前的点 **/
   PointF curP = new PointF();
   OnSingleTouchListener onSingleTouchListener;
  
   public ChildViewPager(Context context, AttributeSet attrs) {
   super(context, attrs);
   // TODO Auto-generated constructor stub
   }
  
   public ChildViewPager(Context context) {
   super(context);
   // TODO Auto-generated constructor stub
   }
  
   @Override
   public boolean onInterceptTouchEvent(MotionEvent arg0) {
   // TODO Auto-generated method stub
   //当拦截触摸事件到达此位置的时候,返回true,
   //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
   return true;
   }
  
   @Override
   public boolean onTouchEvent(MotionEvent arg0) {
   // TODO Auto-generated method stub
   //每次进行onTouch事件都记录当前的按下的坐标
   curP.x = arg0.getX();
   curP.y = arg0.getY();
 
   if(arg0.getAction() == MotionEvent.ACTION_DOWN){
   //记录按下时候的坐标
   //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
   downP.x = arg0.getX();
   downP.y = arg0.getY();
  //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
   getParent().requestDisallowInterceptTouchEvent(true);
   }
  
   if(arg0.getAction() == MotionEvent.ACTION_MOVE){
   //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
   getParent().requestDisallowInterceptTouchEvent(true);
   }
  
  if(arg0.getAction() == MotionEvent.ACTION_UP){
   //在up时判断是否按下和松手的坐标为一个点
   //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
   if(downP.x==curP.x && downP.y==curP.y){
   onSingleTouch();
   return true;
   }
   }
  
   return super.onTouchEvent(arg0);
   }
  
   /**
   * 单击
   */
   public void onSingleTouch() {
   if (onSingleTouchListener!= null) {
  
   onSingleTouchListener.onSingleTouch();
   }
   }
  
   /**
   * 创建点击事件接口
   * @author wanpg
   *
   */
   public interface OnSingleTouchListener {
   public void onSingleTouch();
   }
  
   public void setOnSingleTouchListener(OnSingleTouchListener
onSingleTouchListener) {
   this.onSingleTouchListener = onSingleTouchListener;
   }
  
  }

viewpager双层嵌套,子viewpager无限循环无法手动滑动的更多相关文章

  1. android 解决ViewPager双层嵌套的滑动问题

    解决ViewPager双层嵌套的滑动问题 今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题 之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就 ...

  2. ViewPager,实现真正的无限循环(定时+手动)

    利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...

  3. Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示

    记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...

  4. 封装一个ViewPager真正的实现图片无限循环滚动带导航点

    效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱.并且也不利于我们下次复用,所以 ...

  5. viewPager双层嵌套的事件问题

    问题描述:  ViewPager嵌套viewPager, 当childViewPager中加入了Onclick事件, 导致childViewpager的滑动消息被拦截掉. 很无奈. 解决方法: 重写c ...

  6. ViewPager相互嵌套,导致子ViewPager无法滑动,且子ViewPager中的view无法被点击

        场景:当使用ViewPager进行嵌套的时候,子viewPager是无法进行嵌套的,因此我们要重写ViewPager类,并重写里层viewPager类中的onTouchEvent方法,调用其父 ...

  7. andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

    近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足 ...

  8. 一行代码引入 ViewPager 无限循环 + 页码显示

    (出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...

  9. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

随机推荐

  1. [iOS基础控件 - 4.4] 进一步封装"APP列表”,初见MVC模式

    A.从ViewController分离View 之前的代码中,View的数据加载逻辑放在了总的ViewController中,增加了耦合性,应该对控制器ViewController隐藏数据加载到Vie ...

  2. iOS CAShapeLayer精讲

    前言 CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性.但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义. 关于UIBezierPath,请阅读文章:i ...

  3. S2SH项目框架搭建(完全注解)

    1.引入相关jar包 2.配置Spring配置文件,命名为applicationContext.xml(配置好后放到src目录下) <beans xmlns="http://www.s ...

  4. MongoDB介绍及下载与安装

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.M ...

  5. Atom远程连接服务器报错服务器版本和客户端版本不一致

    Atom远程连接服务器 报错信息: Server version is different than client version Original error message: Version mi ...

  6. 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

    原文地址:http://www.ibm.com/developerworks/cn/web/wa-restful/ 简介: Spring,构建 Java™ 平台和 Enterprise Edition ...

  7. DSC配置

    #配置Remote Desktop Services服务为 自启动,并运行 Configuration Myservice{ # A Configuration block can have zero ...

  8. 复制带有random指针的单链表

    如图1所示,有一条单链表,其节点除了有next指针外,还有一个random指针.random指针可指向单链表中的任意节点,包括它自身.random指针一旦指定,便不再更改.请设计算法,复制此单链表,并 ...

  9. node.js在windows下的学习笔记(8)---进程管理Process

    process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象. 使用process对象可以截获进程的异常.退出等事件,也可以获取进程的 ...

  10. node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端

    //引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是当有请求发送给服务器的时 ...