【问题标题】:TextView: scale down and scale up with sequential animationsTextView:使用顺序动画按比例缩小和放大
【发布时间】:2017-04-18 05:35:49
【问题描述】:

我正在尝试在 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() 方法中添加中断,如下所示,但我怀疑这是“正确的”方法。

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() 方法的存在表明应该有一种方法可以在没有处理程序的情况下完成这项工作。也许问题在于两个动画都涉及同一个对象,但我想这不是一个罕见的用例。虽然它是相同类型的动画,只是方向相反,所以也许这是一个更罕见的用例,但仍然如此。

编辑:我更新了 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>

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>

【问题讨论】:

    标签: android android-animation


    【解决方案1】:

    你不需要处理程序,因为有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()

    【讨论】:

    • 感谢您建议使用 withEndAction() API 并发现 XML 文件中的错误。但是,即使在我更新了 XML 之后,我仍然有相同(或相似)的问题 - 主要问题中的更新中的更多详细信息。
    • 我怎样才能无限次重复这件事。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2020-06-26
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多