如何在使用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
相关产品推荐
相关产品推荐

