Android官方悬停效果原理,Android之AppBarLayout实现悬停吸附伸缩效果

本文介绍了如何利用Android的AppBarLayout、CollapsingToolbarLayout和CoordinatorLayout实现类似开眼App和个人中心的悬停吸附伸缩效果。详细讲解了AppBarLayout的布局滚动标志及其应用场景,以及CollapsingToolbarLayout的使用方法,包括标题的显示和滚动行为。同时,还展示了这两个组件组合实现的搜索界面悬停效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天看到这样一个UI效果,然后自己也仿照实现了下:

56162cce393e

开眼app个人中心.gif

看着挺酷的,也有很多App都用到了这个UI效果,比如开眼App和沪江开心词场就用到了.

所以下面就来简单实现一下这个UI效果吧.

组合三剑客

实现上面的UI效果需要将这三剑客的组合起来用,下面先介绍下这三个控件:

AppBarLayout:

1.AppBarLayout简单介绍

AppBarLayout是android.support:design包中的支持的控件,继承自LinearLayout,实际上就是一个垂直分布的LinearLayout.父类视图结构如下:

public class AppBarLayout

extends LinearLayout

java.lang.Object

↳ android.view.View

↳ android.view.ViewGroup

↳ android.widget.LinearLayout

↳ android.support.design.widget.AppBarLayout

其中官方文档中有这么两句话尤为重要:

This view depends heavily on being used as a direct child within a CoordinatorLayout. If you use AppBarLayout within a different ViewGroup, most of it's functionality will not work.

AppBarLayout also requires a separate scrolling sibling in order to know when to scroll. The binding is done through the AppBarLayout.ScrollingViewBehavior behavior class, meaning that you should set your scrolling view's behavior to be an instance of AppBarLayout.ScrollingViewBehavior.

意思就是说AppBarLayout 必须作为CoordinatorLayout的直接子类,否则很多功能是无法实现的.并且AppBarLayout 必须有一个能滚动的兄第ScrollView (实现了NestedScrollView,listview不可以哦),以此来通知AppBarLayout 何时进行滚动,兄弟View必须实现以下标识:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

官方给出的例子如下:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:layout_height="wrap_content"

android:layout_width="match_parent">

...

app:layout_scrollFlags="scroll|enterAlways"/>

...

app:layout_scrollFlags="scroll|enterAlways"/>

2.AppBarLayout的具体使用

AppBarLayout直接子View的几种响应方式

AppbarLayout 可以指定当某个可滑动的兄弟View滑动手势改变时AppbarLayout 内部直接子View的响应动作,只要通过app:layout_scrollFlags属性来指定响应动作,layout_scrollFlags有5种响应动作,下面简单介绍下:

app:layout_scrollFlags="scroll"

当子view设置响应动作为app:layout_scrollFlags="scroll"时,子view会随ScrollView 的滚动而滚动,就相当于这时的子view变成了ScrollView 的item了,会跟随item一起滚动.

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:title="AppbarLayout"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll"

>

app:layout_scrollFlags="scroll|enterAlways"

当子view设置响应动作为app:layout_scrollFlags="scroll|enterAlways"时,当ScrollView 向下滑动时,子View 将直接向下滑动,而不管ScrollView 是否在滑动。

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

app:title="AppbarLayout"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|enterAlways"

/>

3.app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

当子view设置响应动作为app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"时,

当ScrollView 向下滑动的时候,子View(设置了enterAlwaysCollapsed 的子View)下滑至折叠的高度,当ScrollView 到达滑动范围的结束值的时候,滑动View剩下的部分开始滑动。这个折叠的高度是通过子View的minimum height (最小高度)指定的。

简单来说,就是第二种的加强版,当ScrollView 向下滑动时候,子view先露出半个头,当ScrollView 下滑到顶时,子view的头就全露出来了.

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

android:layout_marginBottom="25dp"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"

/>

4.app:layout_scrollFlags="scroll|exitUntilCollapsed"

当子view设置响应动作为app:layout_scrollFlags="scroll|exitUntilCollapsed"时,

当ScrollView 向上滑动时,子View先响应滑动事件,滑动至折叠高度,也就是通过minimum height 设置的最小高度后,就固定不动了,再把滑动事件交给 scrollview,然后 scrollview才开始滑动。

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

app:titleTextColor="@color/white"

app:layout_scrollFlags="scroll|exitUntilCollapsed"

/>

app:layout_scrollFlags="scroll|snap"

当子view设置响应动作为app:layout_scrollFlags="scroll|snap"时,当ScrollView 下滑到顶部时,如果子view只露出30%的话,子view就会自动折叠回去,如果露出60%的话,就会自动展开.

简单来说,就是具有弹性且遵守就近原则,露的小就干脆不露头了,露的大,就全部出来了.

android:layout_width="match_parent"

android:layout_height="200dp"

android:minHeight="?attr/actionBarSize"

app:title="AppbarLayout"

android:gravity="bottom"

app:titleTextColor="@c

<think>好的,我现在需要帮助用户学习如何用CSS进行界面布局和样式设计的最佳实践。首先,我应该回顾一下用户提供的引用内容,看看有什么可以参考的信息。用户引用了五个来源,其中引用[2]提到了display属性、盒子模型、定位技术,以及响应式布局的应用。引用[5]提到了四种布局类型,比如垂直布局、水平布局、网格布局和窗体布局,这可能和CSS的布局方法相关。 接下来,我需要确定用户的需求。用户想了解CSS界面布局和样式设计的最佳实践,所以需要涵盖布局方法、样式设计原则、响应式设计、性能优化等方面。同时,用户可能希望得到具体的例子和步骤,这样更容易理解和应用。 首先,布局技术方面,CSS的Flexbox和Grid布局是现代布局的核心。Flexbox适合一维布局,比如导航栏或者对齐元素,而Grid适合二维布局,比如复杂的页面结构。需要解释这两种布局的基本用法,并给出代码示例。 然后是盒子模型,这是CSS布局的基础,必须正确理解content、padding、border、margin之间的关系,以及如何通过box-sizing属性来控制盒子的大小计算方式。引用[2]提到盒子模型,所以这里需要强调它的重要性。 定位技术方面,position属性的不同值(static、relative、absolute、fixed、sticky)及其应用场景需要说明,比如绝对定位用于侧边栏固定,引用[2]中的例子可以作为参考。 响应式设计部分,媒体查询是关键技术,需要根据不同的屏幕尺寸调整布局。同时,结合Flexbox和Grid的响应式特性,可以更高效地实现自适应布局。引用[2]提到响应式网页布局,这里可以详细展开。 样式设计方面,应保持代码的可维护性,比如使用CSS变量、BEM命名规范,以及避免过度嵌套选择器。引用[3]提到CSS控制外观,所以需要强调样式与结构分离的原则。 性能优化方面,减少重绘和重排、使用硬件加速、压缩CSS文件等方法都是最佳实践。引用[2]和[3]可能涉及性能相关内容,需要整合进去。 工具和框架方面,引用[5]提到了不同的布局类型,可能和CSS框架如Bootstrap相关,但用户可能更关注原生CSS,所以可以提一下CSS预处理工具如Sass/Less,以及现代框架如Tailwind CSS,但重点还是原生方法。 最后,测试和调试部分,使用浏览器开发者工具检查布局和样式问题,确保跨浏览器兼容性,这也是最佳实践的重要环节。 现在需要组织这些内容,结构清晰,分步骤说明,并给出代码示例。同时,根据用户提供的引用,适当添加引用标记。例如,在提到响应式布局时引用[2],在盒子模型部分引用[2],在布局技术中提到定位时引用[2]和[5]。 还要注意用户要求的问题生成部分,需要提出三个相关问题,比如关于Flexbox与Grid的区别、媒体查询的具体使用,以及CSS性能优化的方法。 在写作过程中,要确保所有数学公式和代码块格式正确,使用中文回答,并且保持自然流畅。最后检查引用是否正确,示例代码是否符合最佳实践,比如使用现代CSS特性如Grid和Flexbox,避免过时的float布局。</think>### 使用CSS进行界面布局和样式设计的最佳实践 #### 一、布局技术的选择与优化 1. **Flexbox与Grid布局** - **Flexbox** 适用于一维布局(行或列),例如导航栏、卡片排列。通过 `display: flex` 定义容器,结合 `justify-content` 和 `align-items` 控制对齐方式。 - **Grid布局** 适合二维复杂布局(行列组合),例如仪表盘、网格化内容。使用 `display: grid` 定义容器,通过 `grid-template-columns` 和 `grid-template-rows` 划分区域[^2]。 ```css /* Flexbox示例:水平居中导航栏 */ .nav-container { display: flex; justify-content: space-between; align-items: center; } /* Grid示例:三列自适应布局 */ .grid-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; } ``` 2. **盒子模型与定位** - 理解 `content-box`(默认)与 `border-box` 的区别,推荐全局设置 `box-sizing: border-box` 避免尺寸计算问题[^2]。 - 定位技术: - `position: relative` 用于微调元素位置。 - `position: sticky` 实现滚动吸附效果(如固定表头)。 - `position: absolute` 结合父容器 `position: relative` 实现精准定位[^5]。 #### 二、响应式设计实现 1. **媒体查询(Media Queries)** 根据屏幕宽度调整布局,例如移动端隐藏侧边栏: ```css @media (max-width: 768px) { .sidebar { display: none; } .main-content { width: 100%; } } ``` 2. **自适应单位与流体布局** - 使用 `%`、`vw/vh`、`rem` 等单位替代固定像素,增强适配性。 - 结合 `min-width` 和 `max-width` 限制元素伸缩范围。 #### 三、样式设计原则 1. **保持代码可维护性** - **CSS变量**:定义主题色、间距等全局变量。 ```css :root { --primary-color: #2196F3; --spacing-unit: 8px; } .button { background: var(--primary-color); padding: var(--spacing-unit); } ``` - **BEM命名规范**:通过 `Block__Element--Modifier` 格式减少样式冲突。 2. **视觉层次与动画** - 使用 `transition` 实现平滑交互(如按钮悬停效果)。 - 关键帧动画(`@keyframes`)适用于复杂动效,但需控制性能开销。 #### 四、性能优化技巧 1. **减少重绘与重排** - 避免频繁修改 `width`、`top` 等触发布局变化的属性。 - 使用 `transform` 和 `opacity` 实现动画(利用GPU加速)[^3]。 2. **代码压缩与按需加载** - 通过工具(如Webpack)压缩CSS文件。 - 分割CSS为模块,按页面加载需求引入。 #### 五、工具与调试 - **开发者工具**:Chrome DevTools 检查元素样式、模拟设备尺寸。 - **CSS预处理器**:Sass/Less 增强代码复用性(如嵌套、混合宏)。 - **跨浏览器测试**:使用工具(BrowserStack)验证兼容性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值