2

我正在尝试创建一个按钮单击动画,例如,当您按下按钮时按钮会缩小一点,当您释放时会按比例放大。如果您只需轻按,您就可以将新闻和新闻稿串在一起。

我设置了一个 onTouchListener 和几个 XML 定义的 AnimatorSet,一个用于新闻,一个用于发布。按下或ACTION_DOWN释放。当您按住按钮时,这工作正常,然后稍后释放。但是通过快速点击,释放动画会在按下完成之前触发,结果通常是根本没有动画。ACTION_UPACTION_CANCEL

我希望我可以使用 AnimatorSet 的顺序功能将发布动画粘贴到可能已经运行的新闻动画的末尾,但没有运气。我敢肯定我可以用回调来装点东西,但这看起来很乱。

这里最好的方法是什么?谢谢!

4

2 回答 2

5

我构建了一个示例 Button 类,它缓冲动画并根据您的需要在队列中执行它们:

public class AnimationButton extends Button 
{
    private List<Animation> mAnimationBuffer = new ArrayList<Animation>();;
    private boolean mIsAnimating;

    public AnimationButton(Context context) 
    {
        super(context);

    }

    public AnimationButton(Context context, AttributeSet attrs) 
    {
        super(context, attrs);

    }

    public AnimationButton(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            generateAnimation(1, 0.75f);
            triggerNextAnimation();
        }
        else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP)
        {
            generateAnimation(0.75f, 1);
            triggerNextAnimation();
        }

        return super.onTouchEvent(event);
    }

    private void generateAnimation(float from, float to)
    {
        ScaleAnimation scaleAnimation = new ScaleAnimation(from, to, from, to);
        scaleAnimation.setFillAfter(true);
        scaleAnimation.setDuration(500);
        scaleAnimation.setAnimationListener(new ScaleAnimation.AnimationListener() 
        {       
            @Override
            public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationRepeat(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) 
            {               
                mIsAnimating = false;
                triggerNextAnimation();
            }
        });

        mAnimationBuffer.add(scaleAnimation);
    }

    private void triggerNextAnimation()
    {
        if (mAnimationBuffer.size() > 0 && !mIsAnimating)
        {
            mIsAnimating = true;
            Animation currAnimation = mAnimationBuffer.get(0);
            mAnimationBuffer.remove(0);

            startAnimation(currAnimation);
        }
    }

}

希望这可以帮助 :)

于 2013-10-09T02:00:52.853 回答
0

看起来 L Preview 添加了为 xml 文件中的状态更改指定动画的能力。

https://developer.android.com/preview/material/animations.html#viewstate

于 2014-10-15T01:13:54.640 回答