垂直滑動按鈕:向上推/向下拉觸發 Action Move,松手彈回原位,有彈性感。
ACTION_DOWN/MOVE/UP/CANCELdy,更新按鈕 translationY(或 layoutParams)跟隨手指|translationY| > threshold 視為「滑到位」ObjectAnimator.ofFloat(btn, "translationY", 0).setDuration(200).start() 快速彈回btn.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
float dy = event.getRawY() - downY;
v.setTranslationY(Math.max(-MAX, Math.min(MAX, dy))); // 限制範圍
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (Math.abs(v.getTranslationY()) > THRESHOLD) {
// 觸發業務
}
v.animate().translationY(0).setDuration(300).setInterpolator(new OvershootInterpolator()).start();
break;
}
return true;
});
OvershootInterpolator 產生彈性超調效果,體驗更佳。