You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滑动时RecyclerView固定位置并伴随图片缩放动画的实现问题

实现方案

你要实现的交互效果如下:
效果演示
这个属于头部折叠缩放+列表锚定固定的交互,用CoordinatorLayout完全可以实现,之前未实现成功大概率是布局层级或者滚动属性配置错误,可按以下步骤调整:

1. 核心布局结构

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    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">

    <!-- 折叠头部区域 -->
    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:background="@android:color/transparent">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="@android:color/transparent"
            android:minHeight="100dp"> <!-- 折叠后头部保留的高度,可自行调整 -->

            <!-- 需要做缩小动画的头部图片 -->
            <ImageView
                android:id="@+id/ivHeader"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@mipmap/ic_header_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7"/>

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <!-- 列表区域,会自动锚定在AppBarLayout下方,折叠后固定在指定位置 -->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:background="@android:color/white"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

2. 添加图片缩小动画逻辑

监听AppBarLayout的滚动偏移量,动态修改头部图片的缩放比例即可:

// 记录AppBarLayout总可滚动距离
var totalScrollRange = 0

appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
    if (totalScrollRange == 0) {
        totalScrollRange = appBarLayout.totalScrollRange
    }
    // 计算滚动百分比 0~1
    val scrollPercent = Math.abs(verticalOffset) * 1f / totalScrollRange
    // 图片从原始大小缩小到0.8倍,可自行调整缩放范围
    val scale = 1f - scrollPercent * 0.2f
    ivHeader.scaleX = scale
    ivHeader.scaleY = scale
})

3. 注意事项

  • 必须保证RecyclerView使用支持嵌套滚动的LayoutManager,LinearLayoutManager、GridLayoutManager默认支持,自定义LayoutManager需要手动开启嵌套滚动开关
  • 不要在AppBarLayout外额外套其他可滚动容器,否则滚动事件会被拦截导致折叠效果失效
  • 如果你不需要折叠时的视差效果,可以把ImageView的layout_collapseMode属性改成pin

内容的提问来源于stack exchange,提问作者Salman khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:06:06