完美解决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万+

OpenWebUI外部模型配置异常排查与修复指南

本文详细解析了OpenWebUI外部模型配置异常的常见问题及解决方案,包括隐藏字符、数据库锁死等典型现象。通过错误日志分析和数据库修复实战指南,帮助开发者快速定位并解决配置问题,确保OpenWebUI与第三方大模型的稳定连接。

weixin_29205061的博客 309

深信服防火墙路由模式开局部署-手把手教学(小白篇)

手把手教学,拿到深信服的防火墙路由模式该如何开局?

m0_64423407的博客 2万+

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

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

NewActivity的博客 6076

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 292

Android 之 WebView开发问题及优化

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

juruiyuan111的专栏 1750

GStreamer Plugin之Gst-nvdewarper

支持三种投影类型 NVDS_META_SURFACE_FISH_PUSHBROOM, NVDS_META_SURFACE_FISH_VERTCYL 和NVDS_META_SURFACE_PERSPECTIVE_PERSPECTIVE。关于每个平面的NvDewarperSurfaceMeta参数(projection_type, surface_index, and source_id)以及内存中有效的矫正平面(num_filled_surfaces)包含RGBA格式的一帧的缓存。矫正后的RGBA格式。

pvmsmfchcs的博客 366

FPGA实现LVDS接口(1)--IBUFDS原语、OBUFDS原语和IOBUFDS原语的介绍及使用(仿真/源码)

通过本文您会学到:Xinlix的源语IBUFDS、OBUFDS和IOBUFDS是什么?

孤独的单刀 2万+

Android WebView 常见问题锦集!

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

anqixing的专栏 1794

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 236

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

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

weixin_34194359的博客 456

OdomLaserCalibraTool标定工具的使用及踩坑记录

首先欢迎扫码关注我的微信公众号【SLAM及ROS学习笔记】 GitHub地址 GitHub - tzhangZJU/OdomLaserCalibraTool: Extrinsic Calibration of a Odom and 2d Laser 作者博客 2d Laser 和 Odomter 内外参数标定工具原理及使用方法_知行合一-优快云博客 其实只是记录了一下我自己的标定过程,和错误解决方法。其实博客和GitHub中也有提及 Error1 这个是由于.

Studying…… 1757

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

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

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

weixin_33850015的博客 412

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

weixin_33843409的博客 482

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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、付费专栏及课程。

余额充值