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

上下滑动时根据motion事件动态调整view高度的实现方法

交互效果示意图

实现思路

核心逻辑是监听用户的滑动偏移量,将偏移增量映射为level view的高度变化值,全程需要设置最小高度和最大高度阈值,避免控件超出预设的显示范围。

通用实现步骤

  • 绑定滑动容器的滚动监听事件
  • 记录上一次的滚动位置,计算本次滑动的y轴偏移增量
  • 向上滑动时偏移增量为正,增加level view高度;向下滑动时偏移增量为负,减少level view高度
  • 对计算得到的新高度做边界限制,确保落在最小/最大高度区间内
  • 更新level view的布局参数刷新显示

Android 端实现示例

通过NestedScrollView/RecyclerView的滚动监听实现:

// 扩展方法:dp转px
fun Int.dpToPx() = (this * Resources.getSystem().displayMetrics.density).toInt()

// 预设高度阈值
val minLevelHeight = 50.dpToPx()
val maxLevelHeight = 200.dpToPx()
var currentLevelHeight = minLevelHeight

nestedScrollView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
    // 计算本次滑动偏移量
    val dy = scrollY - oldScrollY
    currentLevelHeight = (currentLevelHeight + dy).coerceIn(minLevelHeight, maxLevelHeight)
    // 更新控件高度
    levelView.updateLayoutParams<ViewGroup.LayoutParams> {
        height = currentLevelHeight
    }
}

iOS 端实现示例

通过UIScrollView的代理方法实现:

let minLevelHeight: CGFloat = 50
let maxLevelHeight: CGFloat = 200
var currentLevelHeight: CGFloat = 50
var lastOffsetY: CGFloat = 0
// level view的高度约束,提前在布局中绑定
var levelViewHeightConstraint: NSLayoutConstraint!

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let dy = scrollView.contentOffset.y - lastOffsetY
    lastOffsetY = scrollView.contentOffset.y
    currentLevelHeight += dy
    // 边界限制
    currentLevelHeight = max(minLevelHeight, min(maxLevelHeight, currentLevelHeight))
    levelViewHeightConstraint.constant = currentLevelHeight
    view.layoutIfNeeded()
}

前端实现示例

通过页面滚动事件实现:

const minHeight = 50
const maxHeight = 200
let currentHeight = minHeight
let lastScrollTop = 0

const scrollContainer = document.querySelector('.scroll-container')
const levelView = document.querySelector('.level-view')

scrollContainer.addEventListener('scroll', () => {
  const scrollTop = scrollContainer.scrollTop
  const dy = scrollTop - lastScrollTop
  lastScrollTop = scrollTop
  // 计算并限制高度范围
  currentHeight = Math.min(maxHeight, Math.max(minHeight, currentHeight + dy))
  levelView.style.height = `${currentHeight}px`
})

注意如果滑动容器和level view存在嵌套滚动冲突,需要先处理嵌套滚动的事件分发逻辑,避免滑动事件被拦截导致高度变化不跟手。

内容的提问来源于stack exchange,提问作者sunny vishwakarma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:51:01