【发布时间】: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>
【问题讨论】: