文档章节

Android 解决ViewPager双层嵌套的滑动问题

o
 osc_02vmpq90
发布于 2019/02/04 00:12
字数 802
阅读 159
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

原文地址 https://www.cnblogs.com/zhujiabin/p/7083290.html

之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就是ViewPager,整个软件只有广告这一部分ViewPager还好说,但是软件越复杂出现的问题越多,尤其是遇到ViewPager双层嵌套问题,找了很多资料

解决方法一:自定义ViewPager做为父ViewPager控件

复制代码
public class ParentViewPager extends ViewPager{
    private int childVPHeight=0; public ParentViewPager(Context context) { super(context); // TODO Auto-generated constructor stub  init(context); } public ParentViewPager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub  init(context); } private void init(Context context) { // TODO Auto-generated method stub // 获取屏幕宽高 WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE); int disWidth = windowManager.getDefaultDisplay().getWidth(); //根据屏幕的密度来过去dp值相应的px值 childVPHeight=(int) (context.getResources().getDisplayMetrics().density * disWidth + 0.5f); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub //触摸在子ViewPager所在的页面和子ViewPager控件高度之内时 //返回false,此时将会将触摸的动作传给子ViewPager if(getCurrentItem()==1 && arg0.getY()<childVPHeight){ return false; } return super.onInterceptTouchEvent(arg0); } 
复制代码

此方法虽然简单可行,但是会出现,子ViewPager如果为ScrollView的时候,子ViewPager虽然已经滑动到看不到的地方,但是设定的高度内还是不能让父ViewPager左右滑动,onTouch的动作透过了父Viewpager传递到了子控件

解决方法二:自定义Viewpager做为子控件

复制代码
public 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; } }
复制代码

为什么要自己定义onSingleTouch呢?

因为在ViewPager的onTouchEvent中我对onDown进行了操作,进行了操作后就无法将touch事件继续往下传给onClick和其内部控件的任何事件,所以自己做了判断,做了个singleTouch来实现点击的事件

方法二可以完美解决双层ViewPager嵌套后子ViewPager的触摸滑动问题

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
6
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
664
1
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

Canal binlog 日志 Dump 流程分析

点击上方“中间件兴趣圈”,选择“设为星标” 做积极的人,越努力越幸运! Canal 的 dump 支持串行和并行模式两种模式,本篇重点梳理 dump 的核心流程,以便对 dump 过程有一个充分的了解,更...

中间件兴趣圈
今天
0
0
战地笔记:空降大佬如何烧三把火?

背景交代 某公司KF部门,一线KF几百人,二线三线、经理加内部运营一百多人,研发四五十人。KF主要集中在非一线城市某地(后面记为A地,总部记为B地),异地管理问题较严峻,并且A地大本营里除...

腾哥
08/07
0
0
Reactor 3 (13): 数据收集 collect

有的时候流数据有需要转化为其他类型数据,同Stream相同,Reactor也有将数据进行收集的方法: collect () : 将数据根据给出的collector进行收集 collectList() : 收集收集为list形式 collec...

osc_7cws6vmd
11分钟前
0
0
知识变现:做到这2点,用户一定会为你付费!

本文内容整理自: 线下活动:《如何通过直播实现知识变现?》的其中一个主题。 时间:2020年夏天 地点:广州 · 永庆坊 · 钟书阁 举办:Alpha读书会 作为法学院毕业的Python程序员,看门大叔...

看门大叔
昨天
0
0
HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?

LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用: 参考 资料【4 】 这么牛X的名单,你不想了解下LSM Tree吗?装X之前,...

Monica2333
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部