gpt4 book ai didi

android - TextView : scale down and scale up with sequential animations

转载 作者:行者123 更新时间:2023-11-29 14:44:44 25 4
gpt4 key购买 nike

我正在尝试在 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 代码以正确反射(reflect)预期的缩放比例(感谢 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>

最佳答案

您不需要处理程序,因为有 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 : scale down and scale up with sequential animations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43456915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com