一个实现跳转到更多页面的黏性交互的通用组件

news2025/1/11 17:43:40

 a18aef555c9f060982283aab2b5279d0.gif

本文字数:3344

预计阅读时间:9分钟

背景和现状

随着移动互联网的快速发展,通信费用大幅降低,信息爆炸,应用软件展示的信息越来越来,为了有效地组织和展示信息,各大移动平台都提供了列表滚动组件方便开发者使用。 RecyclerView 是  Android 平台使用频率很高的列表滑动组件,它简单易用且能够实现复杂多样的效果,同时既支持竖向滑动又支持横向滑动。

在实际开发中, RecyclerView 中的内容横向向左滑动到 RecyclerView 的最右边后需要让用户看到更多信息是很常见的需求,为了实现此需求,需要通过交互形式提示用户进行操作跳转到更多内容展示页。传统的技术方案是在 RecyclerView 末尾添加一个 item view 用来提示用户点击跳转,这种技术方案有如下的缺点:

  1. 增加了开发工作量,每个需要实现跳转需求的 RecyclerView 都需要增加一个多余的 item view ;

  2.  RecyclerView向左滑动到最右边后,需要用户二次操作,手动点击才能实现跳转;

  3. 这种交互方式很生硬,让用户觉得很无趣,降低了更多页面的曝光率;

全新的技术方案

本技术方案能完美解决传统技术方案的缺点,实现了一个通用组件 HorStickyNavLayout ,采用全新的、更加人性化的交互流程。将有更多跳转需求的 RecyclerView 作为 HorStickyNavLayout 的子 view 即可,没有多余的开发工作量;RecyclerView 横向向左滑动到最右边后,继续滑动有黏性跟手效果,同时逐渐露出根据滚动距离变换的提示文案,整个交互过程顺滑有趣,松手后直接实现跳转,提高了页面跳转的转化率。而且,本技术方案还兼容处理了fling惯性滑动,更加的流畅,提升了用户的使用体验。

原理简述

本技术方案提供了一个承载RecyclerView的父ViewGroup HorStickyNavLayout,RecyclerView大小和 HorStickyNavLayout 一致, HorStickyNavLayout 中额外添加一个 FooterView 去负责绘制提示文案,初始状态, FooterView 放在 HorStickyNavLayout 的最右边外侧,即 FooterView 不在可见区域内。当 RecyclerView 向左滑动到最右边后,继续滑动的时候,将 HorStickyNavLayout 内容整体向左滚动,这样 FooterView 就会进入可见区域,同时在 FooterView 的可见区域内绘制提示文案,根据滚动距离来显示不同的提示文案,若滚动距离小于(等于)阈值(MAX_WIDTH)绘制“继续滑动”,若滚动距离大于阈值绘制“发现更多”。需要说明的是,如果是 fling 惯性滑动(手指离开屏幕时,view 还会进行一个继续滑行的动作,称之为 fling )导致 RecyclerView 向左滑到了最右边,让惯性滑动将 HorStickyNavLayout 内容整体向左最多滚动 MAX_WIDTH 距离,目的是保持在“继续滑动”完全露出的状态即可,符合用户日常交互习惯。滑动结束,若 HorStickyNavLayout 内容滚动距离小于阈值 MAX_WIDTH ,通过动画继续向左滚动,让“继续滑动”提示文案完全露出,若滚动距离大于阈值,通过动画回弹(向右滚动),直到保持在“继续滑动”完全露出的状态。

技术方案的详细阐述

HorStickyNavLayout组件实现原理

  • 首先讲一下 HorStickyNavLayout 组件的结构: HorStickyNavLayout 继承自 FrameLayout, HorStickyNavLayout 被 inflate 之后(onFinishInflate 回调时机),此时就只有一个子 view RecyclerView ,将 RecyclerView 存储在 mChildView 变量中以供在测量阶段使用,然后将 FooterView (后面会讲到)添加到 HorStickyNavLayout 里。在测量(measure)阶段,将 RecyclerView 的测量高度存储在 mHeight 变量中以供在布局阶段使用。在布局(layout)阶段,将 FooterView 放在 orStickyNavLayout 最右外侧。

  • 接着讲一下 HorStickyNavLayout 的核心功能实现:orStickyNavLayout 实现了 NestedScrollingParent2 接口,通过这个接口和 RecyclerView (实现了 NestedScrollingChild2 接口)配合实现嵌套滑动。 RecyclerView 作为 HorStickNavLayout 的子 view , RecyclerView 开始滑动的时候,会通过 onStartNestedScroll 方法通知 HorStickNavLayout 嵌套滑动开始了,在这个时机 HorStickNavLayout 可以做一些初始化的工作,紧接着 RecyclerView 会通过 onNestedPreScroll 方法把 recyclerView (target)、滑动距离(dx 、 dy)和引起滑动类型(type)信息通知给 HorStickNavLayout , HorStickNavLayout 根据这些信息分情况进行处理:

    ad5a248cf4b85c86299f8c0da11f2ee2.png
  1. RecylerView 向左滑到了最右边且是向左滑动(dx大于等于0)时,提示文案逐渐露出(图1),进一步分情况处理:

  • 如果 HorStickNavLayout 当前的滚动距离 scrollX 小于阈值,说明提示文案还没有完全露出,那么让 HorStickNavLayout 内容最多滚动不超过阈值的距离,保证提示文案“继续滑动”处于完全露出状态即可(图2),符合用户的交互习惯;

  • 如果 HorStickNavLayout 当前的滚动距离 scrollX 大于阈值,为了实现黏性效果,让 HorStickNavLayout 的内容可以继续滚动,滚动距离最多不超过3倍阈值(图3);

  • 如果是 fling 惯性引起的滑动,由于惯性的原因, onNestedPreScroll 会被回调很多次,为了优化用户体验,分情况处理:

  • 如果是手指触摸导致的滑动,将滑动距离dx换算成 HorStickNavLayout 内容(其实就是子 viewRecyclerView 和 FooterView )需要滚动的偏移距离 by ,调用 scrollBy 方法执行滚动,同时把滚动距离 scrollX 传给 FooterView 绘制提示文案(图1);

RecylerView 向左滑到了最右边且是向右滑动(dx小于0)时,此时 HorStickNavLayout 内容向左滚动了有一段距离,即 scrollX 是大于0的,那么让 HorStickNavLayout 中的内容向右滚动,提示文案逐渐消失,最多滚动到 scrollX 等于0,然后,无论是触摸引起的还是 fling 引起的多余滑动距离, HorStickNavLayout 不再处理,交由 RecyclerView 继续处理,这样实现了嵌套滑动的连贯性。源码如下:

8dd4622bdb785451bfd2fc8bba18dd98.png

滑动停止时,RecyclerView通过onStopNestedScroll方法通知 HorStickNavLayout ,HorStickNavLayout根据当前的滚动距离 scrollX分情况处理:

f08c009c5289b814944ec6812f8ed439.png

  1. 如果滚动距离 scrollX 大于阈值,那么执行 OffSetListener 接口的 onFinish 方法回调给外部,实现跳转逻辑,并且执行 ProgressAnimation 动画,将滚动距离回弹到完全展示“继续滑动”提示文案状态(图2);

  2. 如果滚动距离  scrollX 小于阈值(图1),执行 UnfoldAnimation 动画,让 HorStickNavLayout 内容滚动到完全展示“继续滑动”提示文案状态(图2);源码如下:

    41a6538d7cae4a8e8f482e9e18eba0bf.png

FooterView的原理:

FooterView是用来绘制提示文案的组件,FooterView根据 HorStickNavLayout 内容的滚动距离 scrollX 将 canvas 向右平移,然后将提示文案逐个在 canvas X 轴负方向上绘制,并且 x 值保持不变,这样可以实现,随着滚动距离 scrollX 从小到大,提示文案是逐渐露出并且是固定在最右边的效果。

至此,本技术方案使用到的原理及步骤介绍完毕。

81eaf5f08531911ec88268d41a6e708e.png

图1
76d9f071af095bbdb0a3a7f3b44fb7bf.png
图2
5ebde5fd451987abb460156cb0bc90c5.png
图3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No.038<软考>《(高项)备考大全》【第22章】信息安全管理

【第22章】信息安全管理1 考试相关2 信息安全管理2.1 安全策略2.2 信息系统安全等级保护2.3 安全的概念适度安全的观点:木桶效应的观点:2.4 安全策略设计2.5 信息安全系统工程能力成熟度模型ISSE-CMM2.6数字证书护照和签证2.7访问控制授权方案2.8 安全审…

评估数据质量的指标总结1

评估数据质量的指标总结1 1、RMSE(root mean square error)均方根误差 作用:RMSE是估计的度量值与“真实”值之间的距离的度量。 计算方法: 2、相关系数r(coefficient of correlation ) 作用:皮尔逊相关系数&#xff…

LeetCode算法小抄--二叉树的各种构造

LeetCode算法小抄--各种情况的构造二叉树构造二叉树构造最大二叉树[654. 最大二叉树](https://leetcode.cn/problems/maximum-binary-tree/)从前序与中序遍历构造二叉树[105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preord…

Unity和UE有啥区别?哪个更适合游戏开发

游戏制作软件中最著名的两个游戏引擎是 Unity 和 Unreal Engine。从独立游戏到大型工作室,许多游戏开发商都在使用它们。如果你打算从事游戏行业工作,你肯定曾经问过自己“我的游戏应该使用 Unity 还是 Unreal Engine?” ” 让我们来了解和比…

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组 1. 问题描述 JmsListener(destination "test_producer", containerFactory "topicListenerContainer")public void receiveTestProducer(String message) throws JMSExceptio…

AI绘画兴起,Stable Diffusion脱颖而出,来一探究竟

近几年,AI图像生成风靡全球,它能够根据文字描述生成精美图像,这极大地改变了人们的图像创作方式。众多专业人士说该技术正在引领着新一轮深度学习创意工具浪潮,并有望彻底改变视觉媒体的创作。 AI绘画兴起 Stable Diffusion脱颖…

[Django] 后台管理系统

浏览之前,请先阅读以下文章 1.Django项目创建 2.Django路由系统 在项目目录下的urls.py文件中,我们会看到这样一个url的配置 启动服务,在浏览器中输入网址http://127.0.0.1:8000/admin/,结果如下 Django提供了一个非常强大的管…

前端解析Excel中的数据进行操作

技术要点:Vue、Element、JSON 功能描述:读取Excel中的数据,利用JavaScript技术奖数据转成Json格式进行操作! 功能描述:只能用前端操作数据,并未实现将数据传送至后端处理! 注意注意注意 如果…

Dapper——分布式跟踪系统

分布式跟踪系统 背景 当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器&#xff0…

常用加密算法

目录 常见的加密算法可以分成三种: 对称加密算法 DES 3DES AES 非对称加密 RSA ECC Hash算法 MD5 SHA1 算法对比 算法选择 常见的加密算法可以分成三种: 对称加密算法;非对称加密算法;Hash算法;接下来我们…

论文 : Multi-Kernel Broad Learning systems Based on Random Features

Multi-Kernel Broad Learning systems Based on Random Features:A Novel Expansion for Nonlinear Feature Nodes 基于核方法的强大性能,本文提出了一种基于多核的BLS系统扩展方法。首先,将多核形式的非线性特征映射合并为广义学习系统的特征节点; 然后…

液晶显示器输入信号接口(一) —— VGA

VGA1. 简介2. VGA接口3. VGA线4. 技术原理4.1 信号传输4.2 模拟信号的扫描方式4.3 参数本文主要介绍VGA,其它输入输出信号接口介绍可从以下链接跳转: 液晶显示器输入信号接口(二) —— DVI 液晶显示器输入信号接口(三) —— HDMI 液晶显示器输入信号接口…

Mysql高级 学习笔记分享

索引:Index是帮助Mysql高效获取数据的数据结构 索引是一种数据结构 ---排好序的快速查找数据结构 、 某种满足特定查找算法的数据结构、以某种方式指向数据 两大功能:查找快、排好序 目的在于提高查询效率,类比字典 如果没有索引&a…

【Vue】学习笔记-列表渲染/数据监视

列表渲染/数据监视基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理基本列表 v-for指令 用于展示列表数据语法:v-for“(item,index) in xxx” :key“yyy”可遍历:数组,对象,字符串(用的很少)&am…

中国农业大学821数据结构经验贴

中国农业大学821经验贴目录个人情况说明初试复习经验数学二英语二政治数据结构复试复习经验目录 个人情况说明 初试成绩 复试成绩 复试成绩在平均水平,综合成绩第五 本科经历 河南双非GPA:3.79,专业排名第6竞赛经历:CCPC省银&…

Matlab进阶绘图第16期—三维填充折线图

三维填充折线图是在三维折线图的基础上,对其与XOY平面之间的部分进行颜色填充,从而能够更好地刻画细节变化。 由于Matlab中未收录三维填充折线图的绘制函数,因此需要大家自行设法解决。 本文使用自制的FilledPlot3小工具进行三维填充折线图…

计算机网络第一章(概述)【湖科大教书匠】

1. 各种网络 网络(Network)由若干**结点(Node)和连接这些结点的链路(Link)**组成多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(互连网)。因此,互联网是"网络的网络(Network of Networks)"**因特…

扩散模型的Prompt指南:如何编写一个明确提示

Prompt(提示)是扩散模型生成图像的内容来源,构建好的提示是每一个Stable Diffusion用户需要解决的第一步。本文总结所有关于提示的内容,这样可以让你生成更准确,更好的图像 一个好的提示 首先我们看看什么是好的提示…

MCM箱模型建模方法及大气O3来源解析

详情点击链接:MCM箱模型建模方法及大气O3来源解析一、大气中O3形成、MCM和Atchem 2原理及Linux系统安装1.大气中O3形成的原理 2、MCM原理及基本流程3、Atchem 2 下载安装4、Linux系统安装5、Atchem 2 运行需要的其他工具A、Fortran;B、Python&#xff1…

小程序分包(普通分包、独立分包)

普通分包和独立分包的区别 当小程序从普通的分包页面启动的时候,首先需要下载主包独立分包是不依赖看于主包就可以运行,提升分包的执行速度,一个小程序可以有多个独立分包。 独立分包属于分包的一种。普通分包的所有限制都对独立分包有效。独…