在 Android 中使用 Sticky Header 创建 ListView 视差效果
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2800+ 小伙伴加入学习 ,欢迎点击围观
一个带有代码片段的快速 Android 示例,用于演示如何创建带有粘性标题的
ListView
视差效果。在我们之前的教程中,我展示了如何
创建 ListView 标题视差动画
。现在在这个例子中,我们将更进一步,制作列表标题视差动画,当列表滚动时,视图会停留在顶部。
您需要按照下面描述的以下步骤来创建列表视图视差效果。
您可以在以下视频中看到它的样子。
1.声明活动布局
首先让我们开始声明您的活动布局。这有点棘手。让我们采用承载英雄图像、粘性视图和 ListView 的框架布局。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/heroImageView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@drawable/wallpaper"
android:scaleType="fitCenter" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#9E9E9E"
android:dividerHeight="1dp"
android:scrollbars="none"></ListView>
<TextView
android:id="@+id/stickyView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#222"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="Heading1"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
2.声明列表标题布局
现在声明列表标题的布局。在这个例子中,我在 FrameLayout 中声明了一个 ImageView 。标题视图声明如下。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/heroImageView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@drawable/wallpaper"
android:scaleType="fitCenter" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#9E9E9E"
android:dividerHeight="1dp"
android:scrollbars="none"></ListView>
<TextView
android:id="@+id/stickyView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#222"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="Heading1"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
请注意,在上面的标题布局中,
-
我们已经声明了
Space
对象。 Android Space widget 是 View 的子类,用于占据屏幕上不可见的透明空间。您不能应用任何样式,例如颜色、背景等。 - 两个 Space 对象的高度与活动布局中声明的主图和粘性小部件的高度相同。
- 这两个不可见视图将有助于计算视图位置并有助于创建平行效果。
3.声明列表行布局
为您的列表视图行声明另一个布局。在此示例中,为了简单起见,我声明了一个简单的
TextView
。您可以通过声明您自己的自定义适配器来设计您选择的奇特列表。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/heroImageView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@drawable/wallpaper"
android:scaleType="fitCenter" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#9E9E9E"
android:dividerHeight="1dp"
android:scrollbars="none"></ListView>
<TextView
android:id="@+id/stickyView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#222"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="Heading1"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
4.处理ListView滚动事件
以下步骤将指导您在活动中创建列表视图、添加列表标题和实现视差效果所需的必要事项。
-
为您的列表视图实现
setOnScrollListener
以处理用户滚动事件。 -
根据ListView中第一项的位置计算出sticky header view的位置。
-
当第一项已经到达顶部时,您不需要重新定位粘性标题视图。
-
设置英雄图像滚动到 ListView 的一半量
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/heroImageView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="@drawable/wallpaper"
android:scaleType="fitCenter" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#9E9E9E"
android:dividerHeight="1dp"
android:scrollbars="none"></ListView>
<TextView
android:id="@+id/stickyView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#222"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="Heading1"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
请 在此处从 Github 下载此项目的源代码。