安卓仿知乎个人主页,实现嵌套滑动和渐隐效果

2023-05-16

本篇文章已经授权微信公共号guolin_blog(郭霖)独家发布

转载请注明作者AndroidMsky和出处
http://blog.csdn.net/AndroidMsky/article/details/53784984
本文github:
https://github.com/AndroidMsky/linkScrollMsky

先看知乎的效果:

这里写图片描述

再看我们实现的效果:

这里写图片描述

网上也有很多嵌套滑动的例子,先说说我这个的优点。
1.头部可以参与滑动
2.下面可以加viewpager
3.支持RecyclerView和ScrollView
4.基于Behavior可以获取事实滚动距离可做更多联动
5.不必重写过多的滑动事件处理,几乎只是玩xml

实现思路:
CoordinatorLayout做最上层布局,上方伸缩处AppBarLayout,下面viewpager里面放NestedScrollView。

观察知乎主页的效果:

1.下面多item处向上滑动首先伸缩上面的head头部,头部收缩后下面则进入滑动,

2.反之向下拉先回把多item出拉到最上方,之后伸展头部。

3.下面多item处支持左右滑动。

4.头像名字渐隐效果。

5.两个title可以点击(title是在head中而不是下面)

1。2

下面我们来各个击破:
1和2其实最容易只要实现系统的CoordinatorLayout

自从谷歌推出CoordinatorLayout后嵌套滑动玩起就没那么难了,
12实现其实十分简单就是系统自带的CoordinatorLayout即可实现,不用书写java代码。结构如下

CoordinatorLayout—– AppBarLayout—–CollapsingToolbarLayout——Toolbar。
CoordinatorLayout—–viewPager。

父布局CoordinatorLayout两个节点AppBarLayout和viewPager
AppBarLayout中的节点ollapsingToolbarLayout它的节点又是Toolbar
如此布局嵌套联动伸缩toolsbar效果就实现了。下面是布局嵌套结构的简略代码。

<?xml version="1.0" encoding="utf-8"?>


<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"

    android:fitsSystemWindows="true">


    <android.support.v4.view.ViewPager
          app:layout_behavior="@string/appbar_scrolling_view_behavior" >
    </android.support.v4.view.ViewPager>
<android.support.design.widget.AppBarLayout
        android:id="@+id/appbar">

        <android.support.design.widget.CollapsingToolbarLayout
            >
       <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                >

       </android.support.v7.widget.Toolbar>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

3

接下来就是3下方的viewpager首先viewpager必须加上这行代码,否则滑动事件不会分发给他,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

另外注意viewpager的高度必须是match——parent否则也不会有联动效果。

<android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
    </android.support.v4.view.ViewPager>

4头像名字渐隐效果。

头像渐隐,我们需要在CoordinatorLayout中找到一个直接子view并且指定:

app:layout_behavior="com.example.liangmutian.linkscrollmsky.RelativelayoutBehavior"

接下来看RelativelayoutBehavior这个类本demo也就这个类中进行了一些简单的坐标处理,

@Override
    public boolean layoutDependsOn(CoordinatorLayout parent, RelativeLayout child, View dependency) {
float maxL = DensityUtil.dip2px(mContext, 150) + DensityUtil.getZhuangtai(mContext);
Message message = new Message();

        if (dependency.getY() > 0) {
float a = ((dependency.getY() - maxL) / (DensityUtil.dip2px(mContext, 356) - maxL));
message.what = (int) (a * 100f);
if (MyActivity.mHandler != null)
                MyActivity.mHandler.sendMessage(message);
        }
        return super.layoutDependsOn(parent, child, dependency);
    }

RelativeLayout child就是刚刚的直接子view,View dependency就是产生滑动的view。通过view滑动距离的控制,我们就可以计算当前滑动幅度,从而实现头像渐隐。356dp就是整个AppBarLayout的高度,150dp是Toolbar的高度。可被滑动的总距离就是,
AppBarLayout的高度-Toolbar的高度-状态栏的高度。那可被滑动的总距离做分母,滑动距离做分子,也就计算出了滑动服务,用过Handler去更新Activity中的控件透明度,就可以了。

super.handleMessage(msg);
float alpha = ((float) msg.what) / 100f;
Log.e("alpha", msg.what + ":" + alpha);
overRe.setAlpha(alpha);

5.两个title可以点击(title是在head中而不是下面)

两个title可点击并跟随头部滑动,这里有坑高危请注意。
我一开始,是直接写到AppBarLayout里,发现不错,可以跟随滑动,也能点,但是如果画上去也就是完全缩进去的时候,就不能点了,原来我们只是把toolsbar设置成透明色,来实现实时透AppBarLayout中的视图,当完全伸缩,Toolsbar就出现在前面了,后面的东西也就不能点了。

解决思路:

类似于悬停的解决思路吧,其实就在Toolsbar中也放置这样一个布局石头,在头部展开的时候收缩,在不展开的时候显示,动态去控制两个一样的布局的显隐藏就ok了。

然后,挖槽还是有坑,如果把AppBarLayout中的布局放在最底下,然后让头部完全缩进去,两个布局不能完全重叠,这样在控制,显示隐藏的时候就会有轻微的跳跃。于是机智如我,发现他们俩只是一个状态的距离好吧一行代码,拉近你我的距离:

RelativeLayout backRe;
backRe.setPadding(0, 0, 0, DensityUtil.getZhuangtai(this));

就这样效果完全实现,只是在RelativelayoutBehavior中进行了一点的坐标运算,其他地方基本不需要,比较容易上手。

感觉还有需优化的地方也希望大家多提意见。

本文github:
https://github.com/AndroidMsky/linkScrollMsky

欢迎关注作者。欢迎评论讨论。欢迎拍砖。
如果觉得这篇文章对你有帮助,欢迎打赏, 欢迎star,Fork我的github。 喜欢作者的也可以Follow。
欢迎加作者自营安卓开发交流群:308372687

这里写图片描述

参考了Chris Banes的内容,
https://github.com/chrisbanes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓仿知乎个人主页,实现嵌套滑动和渐隐效果 的相关文章

  • 回溯算法的理解与使用

    最近在做题的过程中发现很多我不会的题目的解决方法都使用了回溯算法的思想 xff0c 说明我对这个算法目前掌握的还不够牢固 xff0c 因此今天花时间来好好了解这个算法 回溯算法是一种算法思想 xff0c 而递归则是具体的代码结构 就我的学习
  • Kmeans基本思想以及和SVM的区别

    由于最近要用到该算法 xff0c 但是发现算法的思想基本忘掉了 xff0c 只知道是聚类算法 xff0c 因此又回头去学习了一番 xff0c 记录下学习的感受 xff0c 方便以后复习 Kmeans算法的基本思想 xff1a 看如下图 xf
  • HTTPConnection与JSON应用实例

    JSON xff1a 一种轻量级的数据交换格式 JSONObject xff1a 一个json对象 包含一对儿 Key Value 数值 xff0c 在Key和Value之间是以逗号 分隔 JSONStringer xff1a json文本
  • VS(Visual Studio)与VC(Visual C++)对应关系

    opencv 2 4 10 gt vc10 vc11 vc12 opencv 2 4 13 gt vc11 vc12 opencv 3 4 0 gt vc14 vc15 opencv 3 4 1 gt vc14 vc15 Visual St
  • 如何在win10下用Anaconda安装gym(强化学习)

    默认已经安装好Anaconda和pycharm 配置libssl 1 1 x64 ddl libcrypto 1 1 x64 dll 把路径 Anaconda3 Library bin 下面的文件复制到路径 Anaconda3 DLLs 下
  • win10系统下TwinCAT3与VS2019之间的ADS通信

    64 WIN10 TwinCAT3 VS2019 ADS 转博后第一次出差 xff0c 来到了UnitedImaging xff0c 这次的任务是负责在ros系统和TwinCAT3之间的 ADS 通信 作为本次第一篇博客 xff0c 先跑通
  • 两步实现安卓手机秒变网络摄像头

    今天大概是兴趣加技术篇 xff0c 程序员不写点有趣的代码 xff0c 怕是很难在女票和家人面前秀出科技感 GITHUB xff1a https github com AndroidMsky RootPlay 如GIF所示 xff0c 自动
  • TwinCAT3与ROS之间的ADS通信实现

    TwinCAT3与ROS之间的ADS通信实现方法 摘要 xff1a TwinCAT xff08 The Windows Control and Automation Technology xff0c 基于Windows的控制和自动化技术 x
  • 基于DDPG、TD3的UR5装配仿真及其对比

    本项目为上海交通大学2020年度秋季学期 xff0c 乐心怡老师讲授的 最优控制 课程的大作业 xff0c 大部分内容基于方晓猛学长的工作 基于神经网络算法的多机械臂协同控制技术研究 xff0c 最近因为开题所以重新温习了一下强化学习 xf
  • Bullet 布料仿真的底层算法分析

    Bullet 可变物体的底层算法分析 1 计算机图形学中可变建模方法1 1 质点 弹簧模型 xff08 离散 xff09 1 2 有限元连续体模型 xff08 连续 xff09 2 布料模拟的两种主要算法2 1 隐式时间积分2 2 基于位置
  • 【文献阅读】Position Based Dynamics

    文献阅读 Position Based Dynamics 摘要3 Position Based Simulation3 1 算法3 2 求解器3 3 约束投影3 4 碰撞检测和回应3 5 阻尼3 6 接触 4 布料仿真4 1 布料的表示4
  • 完成一篇机器人领域期刊论文所需要的一些工具

    完成一篇机器人领域期刊论文所需要的一些工具 书写工具制图工具PDF格式PPT制图VISIO制图 EPS 格式Inkspace 仿真工具MATLAB路径点生成实时仿真动画Gif生成 ROS 仿真Rviz仿真 剪辑工具录屏软件 Obs Stud
  • NSData转为Int

    在Socket传输中 收到的数据一般都是NSData型 但是我们要对数据进行分析 分解出长度等信息 然后转为Int型 这里就需要转换 swift代码如下 var len Int data getBytes amp len length si
  • 常用的RTMP、RTSP、HTTP协议流直播流地址

    一 RTMP RTSP HTTP协议 这三个协议都属于互联网 TCP IP 五层体系结构中应用层的协议 理论上这三种都可以用来做视频直播或点播 但通常来说 xff0c 直播一般用 RTMP RTSP 而点播用 HTTP 下面分别介绍下三者的
  • 不同工程同一套代码(基础组件SDK一样)的使用

    说明 xff1a 当使用公司的代码要适应不同的地域的需求 xff0c 需要在基础组件的基础上开发不同的App即不同的工程 xff08 请看下图 xff09 xff0c 当两个工程用到同一套代码如何做到互不影响 xff0c 请看下文代码 1
  • 字节序、比特序(一)

    1 字节序 字节序即字节的存储顺序 xff0c 如果数据都是单字节的 xff0c 那怎么存储无所谓了 xff0c 但是对于多字节数据 xff0c 比如int xff0c double等 xff0c 就要考虑存储的顺序了 字节序是硬件层面的东
  • win10下,VsCode搭建golang运行环境,并能断点调试

    第一步 xff0c 下载 基础包 vscode git go xff0c 我用的都是64位 1 vscode https code visualstudio com Download 2 git https git scm com down
  • 揭秘之从RecyclerView滑动监听到Gilde平滑加载图片

    未经允许不得转载 转载请注明作者AndroidMsky及原文链接 http blog csdn net androidmsky article details 53115818 本文应该是RecyclerView的第三篇 xff0c 今天来
  • Unity 动画状态机 设置Trigger后,有时触发动画有时触发不了的问题

    如果想立即触发下一个动画 xff0c 必须把 has exit time 去掉 否则会有时能触发 xff0c 有时触发不了
  • [海康威视]-超脑设备告警布防代码C#实现

    这是海康威视的超脑设备的 告警布防 程序 xff0c 可以控制 接收超脑的识别到的熟人和陌生人的告警信息 通过超脑里面的人脸数据和摄像机抓拍到的人进行比对 xff0c 如果是人脸库的的人就返回 给你告警布防程序信息 xff0c 包括姓名 x

随机推荐

  • [海康威视]-门禁设备告警布防代码C#实现

    这是海康威视的门禁的 告警布防 程序 xff0c 人脸识别 xff0c 身份证识别 xff0c 可以控制 门禁的开关 可以接收门禁刷身份证的相关身份证信息 识图拿代码
  • centOS 7安装 teamviewer 再启动系统就登录不了系统了

    centOS7 安装了teamviewer 12 0 93330 i686 rpm 和teamviewer 13 0 9865 i686 rpm 都出现了同类情况 安装能成功 xff0c 安装命令直接 用的 yum install 安装后
  • Unity 按钮的按下处理事件之自定义处理函数

    例如 qq登陆按钮 首先准备好按钮 xff0c 然后按照下面的步骤 xff1a 1 给按钮添加脚本文件login btn qq cs 其实我已经添加好了 只是演示在哪里添加 2 打开 login btn qq cs 文件 xff0c 添加
  • vs2017安卓开发的问题:模拟器报错 Decryption unsuccessful

    按照微软官方文档还算顺利 直到 这里 Docs Xamarin Xamarin Android 开始操作 了解 Android 第 1 部分 xff1a 快速入门 这里zhi 39 直到写完代码也很顺利 但是调用模拟器时报错了 原因是 xf
  • 《视觉SLAM十四讲》 编译报错问题汇总 Ubuntu20.04

    Ubuntu 20虚拟机环境安装 高翔原视频是ubuntu14 04 xff0c 看了一下 xff0c 有很多库都有兼容问题 xff0c 所以初步按这个Ubuntu 20装 xff1a 这个教程是ubuntu20的 用ubuntu14会不兼
  • C语言结构体(struct)常见使用方法

    目录 结构体声明与定义 结构体变量及其内部成员变量的定义及访问 引用 xff08 C 43 43 xff09 指针和数组 结构体嵌套 结构体与函数传参 占用内存空间 变长结构体 基本定义 xff1a 结构体 xff0c 通俗讲就像是打包封装
  • 如何禁止STL map 自动排序

    最近在做一个SPC SQC 的项目 其中有一处用到了stl map 得到了一个小小的心得 xff0c 分享给大家 我们知道 xff0c 在向map中插入数据对时候 xff0c map中的元素将按照一定的顺序被插入到对应的节点上 xff0c
  • 关于buffer overflow detected 程序崩溃的思考

    我是在使用别人源码 xff08 DBT2 benchmark xff09 的时候 xff0c 编译成功然后运行就出现了这个问题 本以为像这种开源的软件应该没什么太明显的bug xff0c 但是后来细想 xff0c buffer overfl
  • 安卓微信自动抢红包插件优化和实现

    转载请注明作者AndroidMSky和链接http blog csdn net AndroidMsky article details 53490459 又是兴趣系列 网上有很多自动强红包的例子和代码 xff0c 笔者也是做了一些优化 先说
  • 串口通信的基本知识

    串口通信的基本知识 前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 分享一下给大家 点击跳转到教程 本文介绍了串口通讯的基本概念 数据格式 通讯方式 典型的串口通讯标准等内容 串口通讯 xff
  • 【毕业设计】深度学习YOLO图像视频足球和人体检测 - python opencv

    1 前言 x1f6a9 深度学习YOLO图像视频足球和人体检测 x1f947 学长这里给一个题目综合评分 每项满分5分 难度系数 xff1a 3分工作量 xff1a 3分创新点 xff1a 5分 x1f9ff 选题指导 项目分享 xff1a
  • 【C语言编程入门系列】—— 第三章,编写第一个C语言程序!

    导读 xff1a 一般学一门计算机语言的第一堂上机课 xff08 上机 顾名思义 xff0c 上计算机 xff0c 机你太美 xff09 xff0c 就是往屏幕输出 hello world xff0c 本章也不例外 3 1 Hello Wo
  • 基于PCNTL的PHP并发编程

    原创文章 xff0c 转载请注明出处 xff1a http huyanping sinaapp com p 61 178 作者 xff1a Jenner PHP是一门较早出现的WEB开发脚本语言 xff0c 并由于其语法结构简单 易学 开源
  • 基于Redis的MessageQueue队列封装

    原创文章 xff0c 转载请注明出处 xff1a http www huyanping cn p 61 275 作者 xff1a Jenner Redis的链表List可以用来做链表 xff0c 高并发的特性非常适合做分布式的并行消息传递
  • 基于PHP的crontab定时任务管理

    BY JENNER 2014年11月10日 阅读次数 xff1a 6 linux的crontab一直是服务器运维 业务开展的利器 但当定时任务增多时 xff0c 管理和迁移都变得很麻烦 xff0c 而且容易出问题 下面提供了一个使用php编
  • PHP模拟SQL的GROUP BY算法

    BY JENNER 2015年1月24日 阅读次数 xff1a 25 github地址 xff1a https github com huyanping Zebra PHP ArrayGroupBy packagist地址 xff1a ht
  • flume:支持重命名、移动文件的roll file sink升级版

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 flume xff1a 支持重命名 移动文件的roll file sink升级版 转载请注明 xff1a 始终不够 flume xff1a 支持重命名 移动文件的r
  • wordpress全栈优化

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 wordpress全栈优化 转载请注明 xff1a 始终不够 wordpress全栈优化 从最开始计算 xff0c 始终不够 个人博客上线已经有两年多了 从最开始就
  • 递归与循环

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 递归与循环 转载请注明 xff1a 始终不够 递归与循环 大一学C 43 43 的时候 xff0c 老师说过递归与循环是可以相互转化的 xff0c 当时好像是用来两
  • 安卓仿知乎个人主页,实现嵌套滑动和渐隐效果

    本篇文章已经授权微信公共号guolin blog 郭霖 独家发布 转载请注明作者AndroidMsky和出处 http blog csdn net AndroidMsky article details 53784984 本文github