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

如何在使用MotionEvent向上拖拽视图时添加拖拽阻力

实现向上拖拽阻力效果方案

阻力的核心逻辑是:向上拖拽时,仅将手指位移的部分比例应用到视图位置,比例系数越小阻力越大。


第一步:新增成员变量

// 向上拖拽阻尼系数,取值范围0~1,数值越小阻力越大,可根据需求调整
private val UP_DRAG_DAMP = 0.4f
// 记录按下时被拖拽视图的初始Y坐标
private var initialDragViewY = 0f
// 按下时手指的屏幕Y坐标
private var downRawY = 0f

第二步:修改触摸事件逻辑

MotionEvent.ACTION_DOWN -> {
    // 保存按下时的手指屏幕坐标和视图初始位置
    downRawY = event.rawY
    initialDragViewY = viewToDrag!!.y
}
MotionEvent.ACTION_MOVE -> {
    // 计算手指从按下位置到当前位置的总Y轴位移
    val fingerDeltaY = event.rawY - downRawY

    val finalViewY = if (fingerDeltaY < 0) {
        // 向上拖拽,应用阻尼效果,仅部分位移生效
        initialDragViewY + fingerDeltaY * UP_DRAG_DAMP
    } else {
        // 向下拖拽无阻力,完全跟随手指位移
        initialDragViewY + fingerDeltaY
    }

    // 不需要使用0时长属性动画,直接设置y属性性能更优
    viewToDrag!!.y = finalViewY
}

参数调整说明

  • 若觉得向上拖拽阻力过大,可将UP_DRAG_DAMP调大(比如改为0.6,最大为1即无阻力)
  • 若觉得阻力过小,可将UP_DRAG_DAMP调小(比如改为0.2,最小为0即完全无法向上拖动)
  • 如果需要实现「拖拽到指定边界后再增加阻力」的效果,只需额外增加视图位置的边界判断逻辑,在超出边界后再应用阻尼系数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:54:05