【问题标题】:How to slow down an animation in its middle while being executed?如何在执行时减慢中间的动画?
【发布时间】:2016-03-25 17:19:27
【问题描述】:

正如问题已明确指出的那样,当用户单击某个按钮时,我想在执行 TranslateAnimation 时减慢它的速度。

这就是我实例化 TranslateAnim 的方式,其中 -textViewHeightlayoutHeight 只是我之前已经实例化的一些值:

从上到下。

TranslateAnim translateAnim = new TranslateAnim(0, 0, -textViewHeight, layoutHeight);
translateAnim.setDuration(20000);
translateAnim.setInterpolator(new LinearInterpolator());
textView.startAnimation(translateAnim);

这是我想减慢 TranslateAnim 速度的方法:

但它并没有像我预期的那样工作。

public void slowDown() {
    translateAnim.setStartTime(translateAnim.getStartTime() - 20000);
    translateAnim.setDuration((20000 - translateAnim.getElapsedTime()) * 2);
}

我也尝试过这样做,但仍然没有运气:

translateAnim.setInterpolator(new DecelerateInterpolator());

我的自定义 TranslateAnim 类扩展了 TranslateAnimation:

public class TranslateAnim extends TranslateAnimation {

    private long mElapsedAtPause, elapsedTime;
    private boolean mPaused = false;

    public TranslateAnim(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
        super(fromXDelta, toXDelta, fromYDelta, toYDelta);
    }

    @Override
    public boolean getTransformation(long currentTime, Transformation outTransformation) {
        if (mPaused && mElapsedAtPause == 0) {
            mElapsedAtPause = currentTime - getStartTime();
        }
        if (mPaused) {
            setStartTime(currentTime - mElapsedAtPause);
        }
        elapsedTime = currentTime - getStartTime();
        return super.getTransformation(currentTime, outTransformation);
    }

    public long getElapsedTime() {
        return elapsedTime;
    }

    public void slowDown() {
        translateAnim.setStartTime(translateAnim.getStartTime() - 20000);
        translateAnim.setDuration((20000 - translateAnim.getElapsedTime()) * 2);
    }

    public void pause() {
        mElapsedAtPause = 0;
        mPaused = true;
    }

    public void resume() {
        mPaused = false;
    }

    @Override
    public void cancel() {
        super.cancel();
        elapsedTime = 0;
        mElapsedAtPause = 0;
        mPaused = false;
    }
}

有什么解决方法吗?

【问题讨论】:

    标签: android animation android-animation translate-animation slowdown


    【解决方案1】:

    使用自定义插值器而不是线性插值器。线性的导致它具有相等的时间片。自定义的可以让中间的时间片更长。

    例如:

    public class CustomInterpolator implements Interpolator {
    
        public boolean slowMode;
        float lastInput;
        float lastInputBeforeSlowed;
    
        @Override
        public float getInterpolation(float input) {
            if (!slowMode) {
                //Should be edited
                lastInput = input;
                return input;
            } else {
                return (input - lastInputBeforeSlowed) * .5f + lastInputBeforeSlowed;
            }
        }
    
        public void enterSlowMode() {
            slowMode = true;
            lastInputBeforeSlowed = lastInput;
        }
    
        public void endSlowMode() {
            slowMode = false;
            //Should be edited
        }
    }
    

    【讨论】:

    • 我已经知道了,但我的问题的目的是在动画中间执行时这样做。所以不幸的是,这行不通。
    • 它仍然有效。在插值器上有一个函数,告诉它进入慢速模式。单击按钮时调用它。您将不得不使用它,但正确的答案是插值器。
    • 啊,我明白你知道。我会尝试这样做,然后我会回复你。
    • 举个例子,它应该减慢 50%。进入慢速模式时可能会出现跳跃问题,你得检查一下。
    • 试试我刚刚编辑的内容,我认为这将解决跳转问题。基本上它会平滑插值,因此它不会向后移动,而是在那之后增加得更慢。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2012-08-16
    • 1970-01-01
    • 2016-06-24
    • 2022-12-03
    相关资源
    最近更新 更多