TextView:使用顺序动画缩小和放大
TextView: scale down and scale up with sequential animations
我正在尝试在 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() 方法中添加一个中断,如下所示,但我怀疑这是"right" 方法。
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 比较陌生,我已经开始探索动画,所以我想问一下是否真的有 "better" 一种方法可以一个接一个地链接这些动画?我的意思是方法 playSequentially() 的存在表明应该有一种方法可以在没有处理程序的情况下完成这项工作。也许问题是两个动画都涉及同一个对象,但我想这不是一个罕见的用例。虽然它是相同类型的动画只是方向相反,所以这可能是一个更罕见的用例,但仍然。
编辑:我更新了 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>
您不需要处理程序,因为有 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()
.
我正在尝试在 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() 方法中添加一个中断,如下所示,但我怀疑这是"right" 方法。
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 比较陌生,我已经开始探索动画,所以我想问一下是否真的有 "better" 一种方法可以一个接一个地链接这些动画?我的意思是方法 playSequentially() 的存在表明应该有一种方法可以在没有处理程序的情况下完成这项工作。也许问题是两个动画都涉及同一个对象,但我想这不是一个罕见的用例。虽然它是相同类型的动画只是方向相反,所以这可能是一个更罕见的用例,但仍然。
编辑:我更新了 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>
您不需要处理程序,因为有 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()
.