TextView:使用顺序动画缩小和放大

时间:2017-04-17 18:07:14

标签: android android-animation

我试图在Android中创建(我认为是)一个相对简单的动画。也就是说,我想让某个TextView缩小到0,然后点击一个按钮就可以回到1。单击按钮时实际发生的事情是TextView会立即缩小到0(无动画),然后仅将缩放设置回动为1。

在仅使用View.animate()方法的一些失败尝试之后,我使用Animator和AnimatorSet并在XML中定义动画,如下所示:

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<objectAnimator
    android:propertyName="scaleX"
    android:valueFrom="0"
    android:valueTo="1"
    android:duration="300"/>

<objectAnimator
    android:propertyName="scaleY"
    android:valueFrom="0"
    android:valueTo="1"
    android:duration="300"/>

</set>

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<objectAnimator
    android:propertyName="scaleX"
    android:valueFrom="1"
    android:valueTo="0"
    android:duration="300"/>

<objectAnimator
    android:propertyName="scaleY"
    android:valueFrom="1"
    android:valueTo="0"
    android:duration="300"/>

</set>

从onClick()方法调用的animate()方法中的代码

    private void animate() {
        Animator scaleTextDown = AnimatorInflater.loadAnimator(this, R.animator.scale_down);
        scaleTextDown.setTarget(mFactTextView);

        Animator scaleTextUp = AnimatorInflater.loadAnimator(this, R.animator.scale_up);
        scaleTextDown.setTarget(mFactTextView);

        AnimatorSet setScaleDownAndUp = new AnimatorSet();
        setScaleDownAndUp.playSequentially(scaleTextDown, scaleTextUp);
        setScaleDownAndUp.start();
    }

当我尝试使用简单的View.animate()方法创建预期的动画时,我让它使用处理程序在onClick()方法中添加一个中断,如下所示,但我怀疑这是什么&#34;权利&#34;这样做的方法。

public void onClick(View view) {
    //...
    mFactTextView.animate().scaleX(0).scaleY(0).setDuration(300).start();

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mFactTextView.animate().scaleX(1).scaleY(1).setDuration(300).start();
        }
    }, 300);
    //...
}

因此,上面这个简单的代码显然无需使用任何XML等。

我对Android比较陌生,我开始探索动画,所以我问是否真的有更好的&#34;一个接一个地链接这些动画的方法?我的意思是方法playSequentially()的存在表明应该有一种方法可以在没有Handler的情况下完成这项工作。也许问题是两个动画都涉及同一个对象,但我想这不是一个罕见的用例。虽然它只是相反方向的相同类型的动画,所以这可能是一个罕见的用例,但仍然。

编辑:我更新了XML代码以正确反映预期的缩放比例(感谢azizbekian),它仍然没有按预期工作。我现在正在采取相反的行为。在初始单击按钮时,文本现在只是缩小到0并丢失。在随后的点击中,它会以完整尺寸短暂显示(无缩放动画),然后动画缩小到0,并再次丢失。

从技术上讲,在初始XML文件和更新的文件(下图)中,实际上只发生了第一个动画,至少在视觉上是 - 将scale_down.xml用作动画师的源。

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<objectAnimator
    android:propertyName="scaleX"
    android:valueFrom="1"
    android:valueTo="0"
    android:duration="300"/>

<objectAnimator
    android:propertyName="scaleY"
    android:valueFrom="1"
    android:valueTo="0"
    android:duration="300"/>

</set>

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<objectAnimator
    android:propertyName="scaleX"
    android:valueFrom="0"
    android:valueTo="1"
    android:duration="300"/>

<objectAnimator
    android:propertyName="scaleY"
    android:valueFrom="0"
    android:valueTo="1"
    android:duration="300"/>

</set>

1 个答案:

答案 0 :(得分:4)

您不需要处理程序,因为有withEndAction() API:

mFactTextView.animate().scaleX(0).scaleY(0).setDuration(300).withEndAction(new Runnable() {
    @Override
    public void run() {
        mFactTextView.animate().scaleX(1).scaleY(1).setDuration(300);
    }
});

无需明确调用start(),动画将在下一帧开始。

xml不适合您的原因是您错误地指定了开始值和结束值。 scale_down动画应从1开始,最后结束为0,scale_up应从0开始,动画为1。

<强>更新

您在同一个实例上执行setTarget()两次。将第二个scaleTextDown.setTarget()更改为scaleTextUp.setTarget()