完美解决WebView与上层父元素的TouchMove事件冲突

微信小程序禁止页面上下滑动的3种方案与实战避坑指南 在移动端开发中,滚动控制是提升用户体验的关键技术点。其原理在于通过CSS属性、JavaScript事件拦截或组件化方案,精确管理页面的滚动行为。这项技术的核心价值在于实现沉浸式交互,避免因误触导致的页面错位,尤其在弹窗、引导页、全屏展示等场景下至关重要。本文聚焦微信小程序生态,针对常见的“禁止页面上下滑动”需求,深入剖析了CSS的overflow:hidden方案、JavaScript的touchmove事件捕获方案以及利用scroll-view的替代方案。其中,catchtouchmove事件和scrol 阅读详情

在开发过程中你可能会遇到这样一种情况。端里面使用ViewPager嵌套了多个WebView页面,同时某一个WebView中的页面元素需要响应TouchMove事件。正如下图所示的情景:

image

这时你就会发现上层(ViewPager)阻断了下层(WebView)接收TouchMove事件,即使你的WebView在TouchDown时返回true也无效,因为上层直接使用了onInterceptTouchEvent对后续的TouchMove进行了拦截。针对这个问题的解决,简单做法是在重写WebView onTouchEvent方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean ret = super.onTouchEvent(ev);
    if (mPreventParentTouch) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                requestDisallowInterceptTouchEvent(true);
                ret = true;
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                requestDisallowInterceptTouchEvent(false);
                mPreventParentTouch = false;
                break;
        }
    }
    return ret;
}

public void preventParentTouchEvent () {
    mPreventParentTouch = true;
}

代码控制的关键在于mPreventParentTouch这个变量,mPreventParentTouch默认为false,当用户touchdown页面元素时通知该WebView将mPreventParentTouch设置为true。示意代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
    document.getElementById("targetEle").addEventListener("touchstart",
        function(ev) {
            HostApp.preventParentTouchEvent();   // 通知WebView阻止祖先对其Touch事件的拦截
        }
    );
    document.getElementById("targetEle").addEventListener("touchmove",
        function(ev) {
            // todo something on this page
        }
    );
</script>

关于web页面如何通知WebView(即调用Java方法)请参看Android WebView开发问题及优化汇总第8条。

刚提到了上面是一种简单的做法,并不能很好的解决手指滑动过快带来的误操作问题,即当用户快速地滑动时,还是有一定机率会出现ViewPager拦截TouchMove事件而发生了Tab切换而非页面元素做出了响应。要完美解决此问题,就要用到稍微复杂一点的方法(仅是整体消息传递流程复杂一点)。

首先假设在ViewPager之上还有一个父元素叫做ParentViewOnViewPager,当我们接收到页面preventParentTouchEvent通知时就先于ViewPager而进行拦截。如下:

ParentViewOnViewPager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ParentViewOnViewPager extends FrameLayout {
    private MineWebView mDispatchWebView;

    public void preventParentTouchEvent (WebView view) {
        mDispatchWebView = (MineWebView)view;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_MOVE && mDispatchWebView != null) {
            mDispatchWebView.ignoreTouchCancel(true);
            return true;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (mDispatchWebView != null){
            switch (ev.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    mDispatchWebView.onTouchEvent(ev);
                    break;
                default:
                    mDispatchWebView.ignoreTouchCancel(false);
                    mDispatchWebView.onTouchEvent(ev);
                    mDispatchWebView = null;
                    break;
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }
}

即当ParentViewOnViewPager接收到通知时,发起TouchEvent拦截,将拦截到的Touch事件转嫁到装载页面的mDispatchWebView进行事件派发。这样就直接跳过了ViewPager这一层。这里需要注意的是当ParentViewOnViewPager发起拦截时,WebView会接收到一个TouchCancel事件,WebView应该忽略这个事件,以避免页面接收到这个事件而打断整个处理流程。如下代码所示:

MineWebView.java
1
2
3
4
5
6
7
8
9
10
11
12
public class MineWebView extends WebView {
    boolean mIgnoreTouchCancel;

    public void ignoreTouchCancel (boolean val) {
        mIgnoreTouchCancel = val;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return ev.getAction() == MotionEvent.ACTION_CANCEL && mIgnoreTouchCancel || super.onTouchEvent(ev);
    }
}

另外针对这种解决方案,页面端的JS脚本不用做任何变动。

欢迎转载,请注明出处链接!!!

别再让弹窗‘穿帮’了!UniApp + uView 中 u-popup 遮罩层滚动穿透的两种实战解法 本文深入探讨了UniApp中使用uView的u-popup组件时遇到的滚动穿透问题,提供了两种实战解决方案:事件拦截法和CSS动态控制法。通过分析移动端滚动事件传递机制和u-popup工作原理,帮助开发者彻底解决遮罩层滚动穿透的难题,提升移动端弹窗交互体验。 阅读详情

相关推荐

iOS Safari横屏游戏全屏适配:三种方案解决地址栏隐藏难题

在移动端Web开发中,视口(Viewport)适配是构建沉浸式体验的基础技术。其核心原理在于通过meta标签与CSS控制网页在移动设备上的显示区域,而100vh与100%的高度定义差异直接影响布局稳定性。对于追求原生应用般体验的H5游戏,尤其是使用Cocos Creator等引擎开发的横屏项目,解决Safari等浏览器中系统UI(如地址栏)对游戏画面的侵扰具有重要技术价值。这不仅能提升视觉完整性,更关乎触摸交互的精准与流畅。常见的应用场景包括移动端HTML5游戏、互动营销页面以及需要全屏展示的Web应用。本

germmy-神一样的开发 386

onInterceptTouchEvent的ACTION_MOVE事件不执行

前言转载请注明出处:http://blog.youkuaiyun.com/dreamsever/article/details/53907691 最近在学习自定义ViewGroup的时候遇到一个问题,就是onInterceptTouchEvent的ACTION_MOVE事件不触发,这样我就无法实现滑动效果。需求是想自定义一个ViewGroup里面的多个子控件可以左右滑动 大致需求类似这里http://www

dreamsever的专栏 9557

纯JS实现梦幻西游逍遥生动画:Canvas多层动效与物理模拟

Canvas动画是Web前端实现高性能2D交互动画的核心技术,其本质是通过requestAnimationFrame驱动像素级绘制,结合帧率自适应、对象池复用与贝塞尔插值等原理,解决移动端GPU渲染瓶颈与内存抖动问题。相比CSS动画或Lottie,Canvas提供毫秒级控制精度和实时计算能力,支撑碰撞检测、视差滚动、粒子系统等复杂场景,在H5活动页、游戏化营销、大厂可视化面试中具有不可替代的技术价值。本文以《梦幻西游》逍遥生北俱芦洲场景为实践载体,深入解析精灵图帧动画控制、四层画布架构与雪地物理反馈等真实工

dianlu5775的博客 469

Android - requestDisallowInterceptTouchEvent() 阻止父层的View截获touch事件(事件处理机制)...

研究这个方法之前,首先让我们回顾一下View的onTouchEvent()以及onInterceptTouchEvent()的详细解释 (1)onTouchEvent() 当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action。 当有多个层级的V...

646

微信小程序自定义导航栏全攻略:精准计算高度与安全区域适配

在微信小程序开发中,原生导航栏的样式限制和高度不透明性,常常成为实现沉浸式体验和个性化UI的障碍。其核心原理在于,开发者需要通过全局配置启用自定义模式,从而获得页面顶部的完全控制权。这项技术的核心价值在于,它允许开发者突破原生限制,实现与品牌深度结合、高度灵活的顶部导航设计,广泛应用于电商、视频、社交等对UI有高要求的场景。要精准实现自定义导航栏,关键在于利用 `wx.getSystemInfoSync()` API 获取动态的 **状态栏高度**,并结合固定的导航栏本体高度进行计算。同时,必须考虑不同设备

weixin_30482383的博客 870

微信小程序开发实战:从课后题到项目实战的进阶指南

在微信小程序开发中,掌握核心概念与工程实践是构建高质量应用的基础。数据驱动视图通过setData机制连接逻辑层与视图层,其性能优化关键在于遵循“最小化setData”原则,例如使用动态键精准更新数组项,这对实现流畅的商品列表交互至关重要。组件通信则遵循“数据向下,事件向上”的单向数据流,通过properties和triggerEvent实现父子组件解耦,这是构建可复用UI控件(如商品卡片、数字选择器)的通用模式。理解这些原理不仅能提升代码性能与可维护性,更能帮助开发者应对复杂状态管理、网络请求封装等实战场景

340

android webview触摸,如果在webview中有触摸事件,停止触摸事件被ViewPager拦截

我有一个显示碎片页面的ViewPager 。 每个片段都是显示离线网站的WebView。 其中一些网页浏览器中的JavaScript刷卡事件,使他们的工作。我想实现这样的,如果webview没有滑动事件(在JavaScript内),然后触摸事件传递给ViewPager ,如果不是它被消费的networkingViewPager 。我试图覆盖ViewPagers@Override public bo...

weixin_34304211的博客 955

Android手机版浏览器DIV滚动条失效解决方案

NULL 博文链接:https://axl234.iteye.com/blog/2063619

Carson带你学Android:最全面的Webview使用详解

前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是Android里一个叫WebView的组件实现的。今天我将全面介绍WebView的常用用法。 目录1. 简介WebView是一个基于webkit引擎、展现web页面的控件。 Android的Webview在低版本和高版本采用了不同的webkit版本内

Carson带你学Android 28万+

从零开始:用LabVIEW和ModbusTCP协议,像搭积木一样连接Delta PLC

本文详细介绍了如何利用LabVIEW的图形化编程环境和ModbusTCP工业协议,快速连接Delta PLC实现数据通信。通过模块化配置和实战案例,指导读者无需编写复杂代码即可完成寄存器读取、多数据类型处理及系统监控,显著提升工业自动化项目的开发效率与部署速度。

n8m7b6v5c4的博客 693

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

android 监听webview 滑动方向以及是否滑动到顶部、底部

android 监听webview 滑动方向以及是否滑动到顶部、底部 SwipeRefreshLayout 与webview 滑动冲突

NewActivity的博客 6076

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 657

Android 之 WebView开发问题及优化

当我们在WebView中加载出从web服务器上拿取的内容时,是无法访问本地资源的,如assets目录下的图片资源,因为这样的行为属于跨域行为(Cross-Domain),而WebView是禁止的。当我们做类似上拉加载下一页这样的功能的时候,页面初始的时候需要知道当前WebView是否存在纵向滚动条,如果有则不加载下一页,如果没有则加载下一页直到其出现纵向滚动条。哪些资源需要我们去存储在本地呢,当然是一些不会被更新的资源,例如图片文件,js文件,css文件,替换的方法也很简单,重写WebView的方法即可。

juruiyuan111的专栏 1750

【MNE脑电信号处理学习笔记1】数据的读取、可视化、剪裁、滤波和保存

MNE之读取原始数据、可视化数据、剪裁数据、滤波和保存 Reading & visualizaing raw data, cropping, filtering, and saving 原视频教程:Pybrain: M/EEG analysis with MNE Python 原笔记和材料:pybrain_mne 本文根据视频和个人理解对原笔记进行细微修改。 Import the few packages we’ll need import matplotlib import pathlib i

小白家 4214

Project 编制进度计划【项目管理】

Project 项目管理编制进度计划详解。

m0_52861684的博客 5084

Android WebView 常见问题锦集!

收集了一些资料,集中整理一下,以备不时之需,顺便也分享一下,如果觉得好的,麻烦点个赞,觉得没什么意义的可以直接飘过,嘎嘎~~~~ Android 解析比较详细的文章 http://blog.youkuaiyun.com/t12x3456/article/list/2 1、Android的WebView控件载入网页显示速度慢的究极解决方案 http://www.cnblogs.com/x

anqixing的专栏 1794

改进的主动轮廓模型实现图像分割

主动轮廓模型的优点在于可以自适应地调整轮廓形状和位置,适用于不同形状和大小的目标分割。改进的主动轮廓模型是一种有效的图像分割方法,能够适应不同场景下的图像分割需求。改进的主动轮廓模型涉及到许多参数,如模型参数、分割参数、权值系数等,这些参数的调整也会直接影响到分割结果。本文将介绍一个改进的主动轮廓模型,该模型可以实现对图像进行有效的分割。改进的主动轮廓模型是在传统的主动轮廓模型基础上进行的改进。和传统的模型相比,改进的主动轮廓模型加入了外部力和内部力,能够更好地适应复杂场景下的图像分割。

qq_39605374的博客 294

移动端嵌套滚动冲突解决方案:从原理到实践的CSS与JS实现

在移动端Web开发中,事件冲突是导致页面滑动卡顿的常见原因,尤其在嵌套滚动场景下。其核心原理涉及触摸事件序列、滚动链传递以及浏览器的事件决策机制。理解这些基础概念对于优化用户体验至关重要。通过CSS的overscroll-behavior属性,开发者可以声明式地控制滚动边界行为,有效隔离滚动区域,这是现代浏览器中推荐的解决方案。对于需要兼容旧版浏览器的项目,则需借助JavaScript手动监听touch事件,通过计算滑动角度阈值来智能判断用户意图,并适时调用preventDefault()。这两种方案分别从

weixin_34194359的博客 456

Fastgpt本地使用Docker Compose 快速部署

修改文件,并执行再执行d重起容器。具体配置,参考配置详解。可以查看日志,在启动容器后,第一次请求网页,会进行配置文件读取,可以看看有没有读取成功以及有无错误日志。进入 FastGPT 容器,可以通过ls data查看目录下是否成功挂载文件。可通过查看配置文件。可能不生效的原因挂载目录不正确配置文件不正确,日志中会提示invalid json,配置文件需要是标准的 JSON 文件。

洛阳泰山的博客 1631

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2565

uni-app遮罩层滚动穿透全平台解决方案:从CSS到JS事件拦截

在前端开发中,滚动行为是交互设计的核心基础。其原理基于浏览器或容器的事件冒泡与默认行为机制,当触摸事件未被阻止时,便会触发内容滚动。控制滚动对于保障用户体验至关重要,尤其在弹窗、抽屉等模态组件场景下,能有效防止误操作和交互混乱。这一技术价值在于实现界面元素的精准分层与事件隔离,是构建流畅、可控用户界面的基石。其应用场景广泛覆盖移动端H5、小程序及原生App的各类弹窗、侧边栏和全屏覆盖层。本文聚焦于uni-app多端开发中的滚动穿透难题,深入剖析了H5、小程序及App(vue/nvue)平台的不同滚动机制,并

weixin_33850015的博客 412

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VibeCoding桌宠开发避坑指南:从环境搭建到手机适配全解析

在桌面应用与互动媒体开发领域,游戏主循环和状态机是两个核心基础概念。游戏主循环是任何实时交互应用的心脏,它通过持续的事件处理、逻辑更新和画面渲染,驱动程序流畅运行。状态机则是一种管理对象行为模式的设计模式,它能清晰定义和切换如待机、移动、响应等不同状态,避免逻辑混乱,是构建复杂交互系统的关键技术。这些原理在开发具有实时动画和用户交互的应用程序时价值巨大,例如在创建桌面宠物这类常驻程序时,能确保其行为可控、性能稳定。本文聚焦于VibeCoding这一强调趣味与视觉反馈的编程实践,针对新手在开发明日方舟等主题手

weixin_33843409的博客 482

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: Android WebView开发问题及优化汇总
下一篇: 谷歌开源 Google I/O应用源代码,展示Android最佳实践
daeees
博客等级 码龄19年 6粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值