android开发 视图联动_新版首页技术设计和实现方案(Android)

动效设计

1、两级吸顶

CoordinatorLayout+AppBarLayout可以轻松的实现一级吸顶的功能,两级吸顶并不支持。要实现两级吸顶,可以有两种思考:一,在此基础之上再完成一次吸顶;二,直接重写两次吸顶的逻辑,两次吸顶算法跟一次吸顶算法思路上应该是一致的。首页改版使用了第一种思路,因为考虑到顶部搜索框特殊的过渡动画效果,这块本身需要自定义,即便使用控件自带的效果,这块也要重写,所以首先完成了顶部搜索框的自定义吸顶效果,然后借力CoordinatorLayout控件实现了feed流头部的吸顶。这样,整个两级吸顶效果就完成了,顶部搜索栏吸顶通过自定义充分满足了动效,后续扩展和修改会更自如;而feed流头部使用父级控件自带的吸顶效果,大大减轻了再次吸顶的逻辑重写。

对于自定义顶部搜索栏吸顶的功能,可以通过AppBarLayout的OnOffsetChangedListener接口监听完成。onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset)方法返回了appBarLayout的垂直偏移量,通过这个变量基本能完成所有头部的动效。

// 背景图滑动处理if (Math.abs(verticalOffset) < mHeaderHeight) { mIvBackground.scrollTo(0, (int) (-verticalOffset / VELOCITY_OF_REFRESH_BACKGROUND)); // 搜索栏动效处理 int width = mCityWidth - mSearcherBarLeftMargin; int height = mHeaderHeight - statusBarHeight - mSearcherBarShadowHeight - mSearcherBarStickyHeight - mSearcherBarStickyTopMargin;; float rate = ((float) width) / height; int rateScrollY = (int) (rate * -verticalOffset); int scrollWidth = rateScrollY > width ? width : rateScrollY; float widthRate = scrollWidth * 1.0f / width; if (rateScrollY < width) { // 搜索框大小 RelativeLayout.LayoutParams searchParams = (RelativeLayout.LayoutParams) mSearcherBar.getLayoutParams(); searchParams.leftMargin = mSearcherBarLeftMargin + scrollWidth; searchParams.height = mSearcherBarHeight - (int)(diffHeight * widthRate); mSearcherBar.setLayoutParams(searchParams); ... }}

2、头图动效设计图

首页开发时头图下拉的参数设计

文案动画区,放置了下拉刷新的动画和文案,下拉到这个区域即展示刷新动画和相应的文案。

刷新触发区,下拉到这个区域松手后会触发刷新事件,下拉到文案动画区则不会触发刷新。

二楼触发区,下拉到这个区域松手后则触发负二楼的动效,以及负二楼落地;如果负二楼开关没有打开,延续刷新的功能。

此外,下拉刷新的偏移和头图的偏移不是1:1,是500:270的效果,这样可以形成视差,创造出空间层次感。补充,负二楼的过渡效果偏移和下拉偏移是1:1的,体现了跟随效果。

头图下拉偏移,通过SmartRefreshLayout的OnMultiPurposeListener接口监听操作。它提供了onHeaderMoving(RefreshHeader header, boolean isDragging, float percent, int offset, int headerHeight, int maxDragHeight)方法,输出了RefreshHeader下拉的偏移量,通过视差系数,从而实现了头图的动效。

// 下拉刷新时,背景图的移动速率private final static float VELOCITY_OF_REFRESH_BACKGROUND = 500.0f / 270.0f;FrameLayout.LayoutParams lpBg = (FrameLayout.LayoutParams) mIvBackground.getLayoutParams();lpBg.topMargin = mBackgroundTopMargin + (int) (offset / VELOCITY_OF_REFRESH_BACKGROUND);mIvBackground.setLayoutParams(lpBg); 3、负二楼动效设计图

研发实现后的负二楼主页效果图

UI划分区块后的布局元素设计参考图

动画页面渐隐落地页出现的一个过渡效果

整个页面使用全屏设计,对高度进行等比缩放处理以适应不同大小的屏幕设备。整体动画实现难度不大,问题在落地页如何从动画页下面渐显,我们知道逻辑上,负二楼页面和首页是在一个层级,实现落地页在动画页下面实现就是要实现落地页从首页下面出现。这个逻辑是行不通的,即便可以改造落地页,也不能实现Activity从下面出现的过渡效果。

最终解决方案是,负二楼动画页面用一个Activity实现,启动负二楼动画页之前先启动落地页,这两者几乎先后顺序几乎是保持同步的。然而,同时启动两个ui界面,势必会造成动画界面的播放卡顿,尤其是启动承载内容繁多的落地页,对上层动画页造成很大的影响。为解决这一问题,采用了“遮掩”的背景效果,即动画页背景和首页出现负二楼过渡效果图的背景是一致的,且启动动画页后有短暂停留,是为了把这一停留时间分配给落地页先行,从而最大可能的减少卡顿时长。

4、上下身和主体滑动冲突

主体用ScrollView而下身用ListView或RecyclerView会存在滑动冲突问题,这个我们都知道,当然也有解决方案。但是,新版首页的需求远不止这些,它是外层集成下拉刷新和上拉加载功能、内部整体滚动两级吸顶、下半身横向滚动切换页面为一体的复杂构造,我们不能单纯地通过传统的ScrollView+RecyclerView就可以解决。那么脱离传统父级向子级传递事件的思想,Google提供了一套“材料设计”的思想来处理这种复杂的空间关系,其中一个精髓就是将传统开发设计思想颠覆,将子视图的滑动事件向父级传递,通过父级的消费再告知其它子视图进行处理滑动,整个材料形成了一起非线性联动的效果,创造出空间层级感。父子级交互的两个通道是通过NestedScrollingParent和NestedScrollingChild两个接口协议通信的。我们通过CoordinatorLayout、AppBarLayout以及RecyclerView几乎完美地实现了这三者之间的冲突;几乎,但还是存在一些缺陷——AppBarLayout下滑,RecyclerView同时上划,会出现CoordinatorLayout消费子视图事件时的上下抖动问题。这个问题的主要原因是AppBarLayout滑动后的Fling效果未结束时,又再次触发RecyclerView的触摸事件。找到了这个原因,就能容易地解决最后的冲突问题了;在触摸事件里拦截Fling,让父级滚动在每次子视图被触摸时先停止掉就可以解决冲突问题。

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

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

相关文章

oracle 获取一周七天,Oracle中求出本礼拜第一天和第七天的日期

<1>西方应用是周日是first day&#xff0c;中国人思维则为&#xff0c;周日是最后一天。其实&#xff0c;只需要计算到周一&#xff0c;就可直接获得周日。<2>应用实例--Sundayselect to_date(next_day(to_date(2015-02-09 22:00:00, yyyy-mm-dd hh24:mi:ss) - 7, …

网页设计上机考试原题_全国计算机三级信息安全考试 经验分享

为什么选择信息安全&#xff1f;误打误撞报的名&#xff0c;正好又听说是三级里面最好过的。1&#xff09;时间&#xff1a;九月份的考试&#xff0c;大概六月份报名。我在9月2日开学后&#xff0c;才开始准备的&#xff0c;也就二十几天的时间&#xff0c;而且我白天课不少&am…

oracle to_char 数值,oracle to_char格式数值

C:\Users\XXX>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.5.0 - Production on 星期日 8月 28 15:51:42 2016Copyright (c) 1982, 2010, Oracle. All Rights Reserved.连接到:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit ProductionWith the Par…

linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小

为了简化描述&#xff0c;下文提到目标时&#xff0c;如无特殊说明&#xff0c;均指代目标可执行文件或者目标动态库。操作步骤如下&#xff1a;选型时&#xff0c;在同等功能时&#xff0c;尽量选择代码量少、占用空间小的开源的软件。控制C特性的使用&#xff0c;如无必要&am…

newifi mini固件_如何在vmware虚拟机中安装OpenWrt系统,含x86固件编译教程

"OpenWrt项目是针对嵌入式设备的Linux操作系统"&#xff0c; 这是官方给出的定义。OpenWrt确实是一个非常好的嵌入式学习系统&#xff0c;目前市面上上千款设备支持运行OpenWrt&#xff0c;如小米路由、newifi、netgear路由、360路由等。各大wifi芯片厂商sdk开始采用…

宝塔linux忘记密码,宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办

因为性能和安全性上的突出优势&#xff0c;现在用宝塔LINUX面板配置网站环境的站长越来越多&#xff0c;但一些粗心大意的站长经常会遇到这个问题&#xff0c;密码想不起来了&#xff0c;入口链接忘记了&#xff0c;宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办呢&…

minitab怎么算西格玛水平_六西格玛黑带培训工具因子分析的使用

六西格玛黑带培训工具因子分析的使用-张驰咨询一、该命令用于将数据结构简化为较少的量&#xff0c;因子分析的重点是确定能够解释数据变异大的因子数量。二、对话框内容。1、variables&#xff1a;输入需包含在分析中的变量栏。2、Numberoffactorstoextract&#xff1a;输入需…

ssh linux 配置文件详解,Linux ssh服务常用配置的详细描述及建议配置

SSH服务常用选项描述配置文件&#xff1a; /etc/ssh/sshd_config1、AddressFamliy any&#xff1b;支持那IP协议&#xff1b;比如ipv4,ipv6,&#xff1b;默认 any&#xff1b;2、Port 22 &#xff1a;SSH端口号配置&#xff0c;默认22;3、Protocol 2 &#xff1b; SSH协议的2版…

python set集合内部实现_Python 实现集合Set的示例

Python的集合set原理集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合&#xff0c;注意&#xff1a;创建一个空集合必须用 set() 而不是 { }&#xff0c;因为 { } 是用来创建一个空字典。class Array(object):def __init__(self, size32, ini…

linux curl 编译命令,linux 编译 curl 出错

编译curl make 死活不通过&#xff0c;唉执行参数如下&#xff0c;谢谢各位帮忙看看这一步一切正常rootdebian:~/curl-7.45.0# ./configure --with-sslmake一顿编译之后 ...... 然后出错了../lib/.libs/libcurl.so: undefined reference to SSLv2_client_method../lib/.libs/li…

r语言echarts画箱线图_R语言之数据可视化---交互式图表recharts

环图一.安装方式&#xff1a;if (!require(devtools)) library(devtools)install_github("madlogos/recharts")二.使用方法&#xff1a;1.散点图/气泡图echartr(iris, xSepalWidth, yPetalWidth)多个维度&#xff1a;series控制echartr(iris, xSepalWidth, yPetalWid…

linux内核err实现,Linux中IS_ERR()函数的理解

在Linux源码中的fs部分&#xff0c;经常会碰到这样的函数(位于kernel/include/linux/fs.h)&#xff1a;/** Kernel pointers have redundant information, so we can use a* scheme where we can return either an error code or a dentry* pointer with the same return value…

can例程 ecu_ECU程序及CAN总线实现

内容介绍原文档由会员 usactu 发布ECU程序及CAN总线实现1.3万字 34页包括开题报告和任务书摘 要ECU程序就像汽车的大脑&#xff0c;控制着汽车的动力源泉心脏—发动机&#xff0c;控制着汽车底盘&#xff0c;控制着各个车门&#xff0c;控制着各个仪表盘&#xff0c;控制这整个…

linux 禁用smb服务,Samba 4.11 发布,更好的可扩展性与默认禁用SMB1

Samba 4.11是这个SMB/CIFS/AD实现的最新大功能更新&#xff0c;用于提供与Linux和其他平台更好的Windows互操作性。 Samba 4.11的变化非常多&#xff0c;我们有点惊讶它没有被称为Samba 5.0。也许最令人兴奋的是Samba 4.11具有很大的可扩展性改进&#xff0c;它应该能够扩展到1…

airtest测试网页_Airtest自动化测试超级详细教程

Airtest自动化测试1. 安装AirtestIDEAirtestIDE下载地址。我下载的是AirtestIDE_2019-09-10_py3_Mac10-12.dmg。下载完成之后&#xff0c;直接安装即可。2. 设备连接2.1 部署iOS-Tagentgit clone gitgithub.com:AirtestProject/iOS-Tagent.git把手机连接到电脑上然后 打开Xcode…

linux git命令如何简写,简写Git用法,基本命令

git的简单介绍安装首先&#xff0c;你可以试着输入git&#xff0c;看看系统有没有安装Git&#xff1a;graceWIN-VIMIDCOQM7L:/var/www/html/BBB$ gitThe program git is currently not installed. You can install it by typing:sudo apt-get install git若显示,代表已安装grac…

elementui table渲染不出来_测试开发不会前端?ElementUI你需要了解一下

在测试部门内平台类工具的开发需求越来越多&#xff0c;因此也推动了测试开发职位薪水逐步升高。如果开发一个web测试平台&#xff0c;前端技术是必不可少的&#xff0c;像是js、css等。一般在企业内&#xff0c;一个正式产品的前后端开发是职责分明的。端开发只负责业务逻辑&a…

python 画图 线标注_最简洁的Python时间序列可视化实现

TUSHARE 金融与技术学习兴趣小组 翻译整理、编辑 | 一只小绿怪兽译者简介&#xff1a;北京第二外国语学院国际商务专业研一在读&#xff0c;目前在学习Python编程和量化投资相关知识。作者&#xff1a;DataCamp时间序列数据在数据科学领域无处不在&#xff0c;在量化金融领域也…

linux伙伴系统接口,Linux伙伴系统(一)--伙伴系统的概述

伙伴系统的概述Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下&#xff0c;避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题&#xff0c;采用slab解决内部碎片的问题&#xff0c;在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种&#xff1…

c# 创建委托 消息订阅_C#面向对象之委托和事件

委托1.定义&#xff1a;委托也叫代理&#xff0c;就是把事情交给别人来做。2.声明委托语法&#xff1a; delegate 返回类型 委托名称();委托使用步骤1.声明委托public delegate int CalculatorDelegate(int a,int b);2.根据委托类型创建方法3.创建委托对象并指定方法Calculator…