You need to enable JavaScript to run this app. 安卓开发:按钮松开时如何停止控制玩家下移的ObjectAnimator动画?
优惠活动
大模型
产品
解决方案
定价
更多

安卓开发:按钮松开时如何停止控制玩家下移的ObjectAnimator动画?

代码核心问题定位
  • 动画对象引用丢失:当前代码将ObjectAnimator的初始化逻辑写在onTouch方法的顶层,任何触摸事件(按下、抬起、按钮上的滑动MOVE事件)触发时,都会新建一个动画实例覆盖外部的animation引用。当手指抬起执行cancel()时,停止的根本不是按下时刻启动的运行中动画,旧动画因失去引用会一直执行到结束。
  • 动画逻辑与需求不匹配:
    1. 给translationY(Y轴偏移属性)传入的目标值取的是player.getX()(X轴绝对坐标),属性和取值的坐标系完全错位,根本达不到预期的移动效果
    2. 设置1000ms时长仅偏移1F的位移量,视觉上几乎无移动反馈
    3. 单次终点式的动画模型,本身就无法实现“按住持续移动、松开即停”的效果——这类固定终点的动画跑到设定时长就会自动停止,没法响应长按状态持续运动
  • 触摸事件处理不全:未覆盖ACTION_CANCEL分支,当触摸事件被上层父容器拦截时,无法收到ACTION_UP回调,会出现动画无法停止的异常。
适配需求的修正实现

要实现按住按钮持续下移动、松开停止的效果,需要复用同一个动画实例,搭配无限重复模式实现持续移动,同时补全触摸事件分支:

// 定义全局复用的动画实例,不要在onTouch中反复新建
private ObjectAnimator moveDownAnimator;

// 初始化玩家View后提前配置动画参数
private void initPlayerMoveAnimator(View playerView) {
    // 以玩家View当前位置为起点,向下累计位移
    moveDownAnimator = ObjectAnimator.ofFloat(playerView, "translationY", 0f, 300f);
    // 设置无限重复,实现按住时持续向下移动的效果
    moveDownAnimator.setRepeatCount(ValueAnimator.INFINITE);
    moveDownAnimator.setRepeatMode(ValueAnimator.RESTART);
    // 调整动画时长控制移动速度,可根据实际手感调整数值
    moveDownAnimator.setDuration(2000);
}

moveDOWN.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 每次按下重置动画进度,避免残留之前的动画状态
                moveDownAnimator.setCurrentFraction(0f);
                moveDownAnimator.start();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // 手指抬起/触摸被拦截时,停在当前位置停止动画
                moveDownAnimator.cancel();
                break;
        }
        // 消费触摸事件,保证后续动作能正常回调
        return true;
    }
});
额外注意点
  • 优先使用cancel()停止动画而非end():cancel()会让玩家停在动画当前的进度位置,不会直接跳转到动画终点,更符合游戏操作的交互手感
  • 不要在触摸事件回调中反复新建动画实例,重复创建动画会带来不必要的性能开销,也容易出现引用错乱的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 00:06:08