本文首发我的公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力

背景

最近项目在开发中,需要实现 WebView 吸顶的效果。刚开始在 Demo 实现的时候,使用的是普通的 WebView。切换到项目的时候,由于使用的是 X5 WebView,在解决过程中。又遇到了一些问题,觉得挺有代表性的,就记录了下来。

如果你也有相似的问题,可以参考这种思路解决。

实现原理简述

讲解之前,我们先来看一下效果图

说到嵌套滑动,很多人第一时间都会想到 CoordinatorLayout behavior ,但是 webview 本身并不是 NestedScrollChild 的,无法实现。

于是,我们可以自己实现 NestedScrollChild 接口,去实现嵌套滑动。具体的实现原理,可以参照我的这一篇博客。

【原理篇】WebView 实现嵌套滑动,丝滑般实现吸顶效果,完美兼容 X5 webview

系统 webview 实现吸顶效果

第一步:引入我的开源库

 implementation("io.github.gdutxiaoxu:nestedwebview:0.22")

第二步:借助 CoordinatorLayout behavior 实现吸顶效果

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent"tools:ignore="MissingDefaultResource"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/appBarLayout"android:layout_width="match_parent"android:layout_height="250dp"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="?attr/colorPrimary"android:scaleType="fitXY"android:src="@drawable/tangyan"app:layout_scrollFlags="scroll" /></com.google.android.material.appbar.AppBarLayout><io.github.gdutxiaoxu.nestedwebview.NestedWebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

X5 webview 实现吸顶效果

第一种方式

第一种方式,使用我封装好的 NestedX5WebView,在布局文件中指定 behavior

第一步:引入我的开源库

implementation("io.github.gdutxiaoxu:nestedx5webview:0.22")

第二步:借助 CoordinatorLayout behavior 实现吸顶效果

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent"tools:ignore="MissingDefaultResource"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/appBarLayout"android:layout_width="match_parent"android:layout_height="250dp"app:layout_behavior=".behavior.DisableAbleAppBarLayoutBehavior"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="?attr/colorPrimary"android:scaleType="fitXY"android:src="@drawable/tangyan"app:layout_scrollFlags="scroll" /></com.google.android.material.appbar.AppBarLayout><io.github.gdutxiaoxu.nestedwebview.x5.NestedX5WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

第二种方式

使用腾讯的 WebView,在代码当中动态指定 X5ProxyWebViewClientExtension 即可

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent"tools:ignore="MissingDefaultResource"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/appBarLayout"android:layout_width="match_parent"android:layout_height="250dp"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="?attr/colorPrimary"android:scaleType="fitXY"android:src="@drawable/tangyan"app:layout_scrollFlags="scroll" /></com.google.android.material.appbar.AppBarLayout><com.tencent.smtt.sdk.WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

代理 X5 webview 相关的触摸事件

        val x5CallBackClient = X5CallBackClient(webView.view, webView)webView.setWebViewCallbackClient(x5CallBackClient)webView.webViewClientExtension = X5ProxyWebViewClientExtension(x5CallBackClient)

更多吸顶效果

使用CoordinatorLayout打造各种炫酷的效果

自定义Behavior —— 仿知乎,FloatActionButton隐藏与展示

NestedScrolling 机制深入解析

一步步带你读懂 CoordinatorLayout 源码

自定义 Behavior -仿新浪微博发现页的实现

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页

源码地址

nestedwebview, 可以帮忙给个 star 哦。

如果觉得对你有所帮助的话,可以关注我我的微信公众号徐公,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,一起建立核心竞争力

【使用篇】WebView 实现嵌套滑动,丝滑般实现吸顶效果,完美兼容 X5 webview相关推荐

  1. axure9怎么让页面上下滑动_Axure制作:页面上下滑动时的菜单栏悬浮吸顶效果

    昆仑女神的故事,sem优化,破产管理人 在移动端页面上,用手上下滑时,超过一定向上滑动时,菜单栏能有吸顶效果,如何用axure实现呢? 作者在最近在手机移动端的时候,有一个动画,希望达到效果:用手上下 ...

  2. 仿京东、淘宝首页,通过两层嵌套的RecyclerView实现tab的吸顶效果

    为什么会有这篇文章 之前写过一篇文章使用CoordinatorLayout过程中遇到的两个问题以及浅析CoordinatorLayout工作机制,这篇文章上主要讲了通过CoordinatorLayou ...

  3. vue可视化拖拽组件模板_基于 Vue 丝滑般拖拽排序组件VueSlicksort

    今天给大家分享一个功能超强的自由拖拽排序组件VueSlicksort. vue-slicksort 一款功能强大的可拖拽的vue.js组件.拥有丝滑般拖拽动画效果,支持水平/垂直/网格拖拽排序.还可以 ...

  4. 揭秘双11丝滑般剁手之路背后的网络监控技术

    简介:本篇将重点介绍Hologres在阿里巴巴网络监控部门成功替换Druid的最佳实践,并助力双11实时网络监控大盘毫秒级响应. 概要:刚刚结束的2020天猫双11中,MaxCompute交互式分析( ...

  5. xp精简工具_Windows10你也可以精简优化,丝滑般极爽轻松做到,再也不卡了

    Windows10大家也比较熟悉了,都在使用,有的喜欢有的厌恶,喜欢的肯定是非常熟练操作Windows10了,厌恶呢一般是不了解Windows10操作,不想去接触新生事物,Windows7都已经够用了 ...

  6. 最贴近京东首页体验的嵌套滑动吸顶效果

    吸顶效果是各家 App 或多或少都会用的一个交互,这种交互也常见于 PC.H5,可以说是一种通用性很强的前端交互体验,相比较来说京东首页的嵌套滑动吸顶效果是各个类似效果中体验比较好的一个,因为在嵌套布 ...

  7. Android Tv版嵌套滑动实现极光云视听顶部导航效果

    Android Tv版嵌套滑动实现极光云视听顶部导航效果 通过这篇文章您可以和小王一起: 了解嵌套滑动的流程,原理 自定义Behavior的原理. 简单的实现TV版的嵌套滑动 小王最近很开心,上次快速 ...

  8. ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable

    今天给小伙伴们分享一款纵享丝滑般体验的Vue拖拽树形表格DragTreeTable. vue-drag-tree-table 基于vue.js实现可拖拽排序的树形表格组件.支持拖拽排序.固定表头.拖拽 ...

  9. 让代码丝滑般跳转,rust-analyzer,你值得拥有

    1 RLS触怒了我 我是一个专一的人,从学习Rust起就在vscode中使用rls作为跳转插件(主要原因其实是懒),如果不是今天它彻底触怒了我,恐怕我还会对它继续钟情下去. 事情的原委是这样的,今天下 ...

最新文章

  1. sed当中使用变量替换以及执行外部命令
  2. 神奇的问题记录【SqlDataAdapter Fill DataSet】
  3. tf 从RNN到BERT
  4. Cookie文件内容的含义
  5. 07-图5 Saving James Bond - Hard Version
  6. 使用nrm管理npm源的切换
  7. 基于python的猜大小游戏
  8. 使用梦网云通讯平台解决手机验证码问题
  9. 英语学术论文写作常用词汇
  10. 工作那些事(二十八)项目管理模式:项目型、职能型、矩阵型
  11. [心得]如何系统自学经济学
  12. 格式化输出latex数字罗马字体
  13. VPS云主机的定义和基本优势有哪些
  14. 读唐巧博客2011年总结感想
  15. github unable to access 'https://github.com/...: Failed to connect to github.com port 443‘
  16. matplotlib图表多曲线多纵轴绘制工具方法
  17. android qq隐藏功能,90﹪的人都不知道--手机QQ这些隐藏的功能!
  18. 神经网络入门(个人理解)
  19. 令人惊艳的文章开头,建议【收藏】
  20. python中双等号与单等号的区别_双等号 == 与单等号 =

热门文章

  1. mysql的CURDATE() + 1,月底最后一天不生效的问题,踩坑中!
  2. 微信小程序实现滚动条
  3. “信创产业”是什么?2020“信创”脱颖而出
  4. 创e专访 | 闪马智能CEO彭垚:让创业“燥”起来
  5. qt linux 横屏,linux Qt4.8屏幕旋转(横屏、竖屏)
  6. 最新免杀!可过360核晶与Defender(SysWhispers3)
  7. Viper4Windows V4W蝰蛇音效电脑音效增强工具
  8. PGSQL修改在使用中的数据库名称
  9. spark提交python程序_pyspark:带有spark提交的jars依赖
  10. linux卸载netdata,Netdata 最帅Linux系统监控工具