Android WebView与ViewPager的滑动冲突分析
前言
如题所述,我使用的架构是ViewPager+Fragment+WebView进行开发的,由于WebView的html页面代码是第三方的,这里不好放出来,所以只能放一个大致的架构图,如图所示,ViewPager包含了两个fragment,可以左右滑动的,左边Fragment的WebView顶部包含了一个banner,这种情况下就会引起banner与ViewPager的滑动冲突。这个问题已经有人有解决方案了,见Viewpager与webview滑动冲突的解决方案,但是这个解决方案需要前端配合,有点麻烦,所以我自己想了个解决方案
问题点
- WebView虽然是继承自AbsoluteLayout的但是却不能获取到它的子View
- 我的这个WebView是一个音乐展示页面,所以上滑会加载更多
- 如何获得banner的高度
解决方案
由于问题点1的存在,无法使用获取子View方式来获取到banner,只能通过获取banner的那一段区域,然后通过WebView的onTouchListener设置requestDisallowInterceptTouchEvent()来进行解决,代码如下:
mWebView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//Rect用于描述WebView的在整个界面坐标,它的left,top,bottom,right四个属性就是描述一个View相对于参照物(如父布局的)的距离Rect rect = new Rect();//v即是mWebView,getLocalVisibleRect(rect),是把WebView的相对于父布局的坐标描述出来并放入Rect中v.getLocalVisibleRect(rect);switch (event.getAction()) {case MotionEvent.ACTION_DOWN://rect.top == 0表示滑动到顶部if (rect.top == 0 && event.getY() >= 0 && event.getY() < dpToPx(162)) {mWebView.requestDisallowInterceptTouchEvent(true);} else {mWebView.requestDisallowInterceptTouchEvent(false);}break;}return false;}
});int dpToPx(int dp) {float scale = getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);
}
复制代码
这里没有直接使用event.getY()或者是event.getRawY()是因为问题点2的存在,因为滑过了banner之后会出现这两个值还是处于有效的阶段,必须要添加banner处于显示状态的条件。这个地方使用的getLocalVisibleRect方法,关于这个方法我是参照的这个地方,getGlobalVisibleRect和getLocalVisibleRect,直接看最后的结论即可。
最后一个问题点3是关于如何获取banner高度的问题,有两种方式,第一种是直接找前端问, 但是我问的前端不是很靠谱,给的是错的。另一种,自己算,我用的是Android Monitor,AndroidStudio 2.3.3之后好像就没了,只能在SDK目录/tools/monitor打开了,然后截图工具Dump View Hierarchy for UI Automator找到banner对应的View,计算高度
(0,1080)代表的是宽度,(193, 676)代表的是高度,最后计算出来banner的高度是483,单位是px,需要转换为dp。
Android WebView与ViewPager的滑动冲突分析相关推荐
- Slidingmenu与ViewPager广告栏滑动冲突解决分享
之前在公司开发的时候, 在主页部分fragment使用了ViewPager作为广告栏,但项目里又引用了SlidingMenu开源库用作侧滑菜单,于是这里产生了滑动冲突:广告栏不能滑动了,滑动却是侧滑了 ...
- 关于ViewPager嵌套ViewPager左右滑动冲突解决方法
情况如下,TabLayout+ViewPager+Fragment,其中一个Fragment里面又嵌套了一层TabLayout+ViewPager+Fragment,运行的时候出现了两个情况. 1.子 ...
- Android笔记之ViewPager实现滑动页面
1.概述; Viewpager的最大特点就是实现滑动的界面 多个页面的内容可以有两种填充方式:View (普通Activity下),Fragment(V4的Fragmentctivity或者Fragm ...
- android 禁止Viewpager左右滑动功能
今天,简单讲讲Android如何禁止Viewpager左右滑动功能. 原理: 百度后发现重写ViewPager,覆盖ViewPager的onInterceptTouchEvent(MotionEven ...
- 每日一问:Android 滑动冲突,你们都是怎样处理的
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 在 Android 开发中,滑动冲突总是我们一个无法避免的话题.而对于解 ...
- pb自定义控件 事件_Android WebView与下拉刷新控件滑动冲突的解决方法
使用WebView时一般会在外层使用下拉刷新控件如(SwipeRefreshLayout).但是测试时会发现网页无法上拉,往上滑动就会触发下拉刷新控件的refresh事件.所以这里记录一下解决该问题的 ...
- 解决ViewPager嵌套WebView时滑动冲突问题
问题描述 当ViewPager里嵌套WebView时,默认WebView是处理不了滑动事件的.这样的话,如果WebView里内容一屏展示不完,就没法查看完整内容了. 解决方案 定制WebView,覆写 ...
- Android滑动冲突的完美解决方案
一.Android滑动冲突的完美解决方案 在Android开发中滑动冲突可以说是比较常见的一类问题,也是比较让人头疼的一类问题,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了.滑动冲突主 ...
- Android滑动冲突解决方法
Android滑动冲突解决方法 滑动冲突 首先讲解一下什么是滑动冲突.当你需要在一个ScrollView中嵌套使用ListView或者RecyclerView的时候你会发现只有ScrollView能够 ...
最新文章
- AdminIII连接linux Postgresql过程中的几个小问题
- 东南亚智能金融决策平台Silot完成A 轮融资,SBI 领投...
- 遗传算法对于神经网络的优生优育
- 前线解释多线程《二》
- 多线程——线程的生命周期
- 动态规划 —— 线性 DP
- 春联c语言,千古绝对过年春节对联80幅
- 涉密专用服务器审计系统,国产专用服务器主机审计
- mybatis中转义 大于,小于,大于等于,小于等于
- 初中信息技术认识计算机,初中信息技术 认识计算机
- 水利水电水资源模拟试题3
- 【思想落地】一文分享Qt界面的设计与开发
- 用大于一素数的最小素数替换4*4矩阵中的素数
- 运算放大器 你想知道的都在这里
- IntelliJ IDEA 破解 到2100年到期
- python 自动生成问卷表的软件的设计与实现 毕业设计源码291138
- stream流的常用方法
- L1-059 敲笨钟
- 达观数据智能对公审贷系统,深化上海银行普惠金融、供应链金融科技创新
- python常用关键字意思_Python 关键字列表及示例
热门文章
- 一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案
- C和C++安全编码笔记:整数安全
- 远程过程调用RPC简介
- Intel TBB简介及在Windows7 VS2013上源码的编译过程
- Linux Socket基础介绍
- Windows7下OpenGL简单使用举例
- 【OpenCV】读取csv文件
- c7pro android7,三星c7pro和iphone7哪个值得买?三星Galaxy c7 pro和苹果iphone7区别对比详细评测...
- layui如何存在多个弹窗_layui常见弹窗使用方法
- 远程服务器端口怎么修改,如何修改远程服务器端口号