TextView:按顺序放大和缩小动画

Bob*_*ski 1 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

从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();
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用简单的View.animate()方法创建预期的动画时,我通过使用处理程序在onClick()方法内添加一个中断来使其工作,如下所示,但是我怀疑这是“正确”的方法它。

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);
    //...
}
Run Code Online (Sandbox Code Playgroud)

因此,以上简单代码显然无需使用任何XML等即可工作。

我是Android的新手,所以我开始研究动画,所以我想问是否真的有一种“更好”的方法将这些动画一个接一个地链接?我的意思是playSequentially()方法的存在表明应该有一种无需Handler即可完成此工作的方法。也许问题在于两个动画都涉及同一个对象,但是我想这不是一个罕见的用例。尽管它是同一类型的动画,但方向相反,所以也许这是一种罕见的用例,但仍然如此。

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

从技术上讲,在初始XML文件和更新的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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

azi*_*ian 6

您不需要处理程序,因为有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);
    }
});
Run Code Online (Sandbox Code Playgroud)

无需start()显式调用,动画将从下一帧开始。

xml对您不起作用的原因是,您错误地指定了起始值和结束值。scale_down动画应从1开始到0结束,并且scale_up应从0开始并动画成1。

更新资料

setTarget()在同一实例上执行两次。将秒更改scaleTextDown.setTarget()scaleTextUp.setTarget()