2017-04-17 80 views
1

我试图在Android中创建(我认为是)相对简单的动画。也就是说,我想让某个TextView缩小到0,并在点击一个按钮时回到1。当我点击按钮时实际发生的事情是TextView立刻缩小到0(没有动画),然后动画只缩放回到1.TextView:缩小比例并按顺序动画放大

在一些失败的尝试只使用View.animate()方法后,我诉诸了到动画和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()方法

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()方法中添加一个break,但我怀疑这是做到这一点的“正确”方法。

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和我已经开始探索动画,所以我询问是否实际上是一个有“更好”的方式来连续链接这些动画?我的意思是playSequentially()方法的存在表明应该有一种方法可以在没有Handler的情况下完成这项工作。也许问题是两个动画都涉及同一个对象,但我想这不是一个罕见的用例。虽然它只是相反方向的动画,但它仍然是罕见的用例。

编辑:我更新了XML代码,以正确反映预期的缩放比例(谢谢azizbekian),它仍然无法按预期工作。我现在正在得到相反的行为。在初始点击按钮时,文本现在简单地缩小到0并丢失。在后续点击时,它会以全尺寸(无缩放动画)简要显示,然后将缩放动画缩小到0,然后再次丢失。

从技术上讲,在最初的XML文件和更新的文件(下面)中,只有第一个动画实际上正在发生,至少在视觉上 - scale_down.xml被用作Animator的源。

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> 

回答

3

你不需要处理,因为有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不适合你,是因为你错误地指定了开始和结束值。动画应该从1开始并最终为0,并且scale_up应该从0开始并且动画到1。

更新

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

+0

感谢您提供withEndAction()API并发现XML文件中的错误。但是,即使在我更新XML之后,我仍然有相同(或类似)的问题 - 主要问题更新中的更多细节。 –

+0

@BobanTalevski,已更新。 – azizbekian