gpt4 book ai didi

android - 如何使这段动画代码更有效?

转载 作者:行者123 更新时间:2023-11-30 03:00:21 26 4
gpt4 key购买 nike

此代码通过 ObjectAnimatorAnimationSet 在单击按钮时切换两个 View (mView1 和 mView2)的 y 位置。在翻译动画的同时,两个 View 的alpha 值都会降低并再次增长。这只是一个可以玩一下的设置。 alpha 动画是在 XML 中定义的,翻译动画是用代码完成的。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="0.5"
android:valueType="floatType"/>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1.0"
android:valueType="floatType"/>
</set>
@Override
public void onClick(View v) {
if (mView1 != null && mView2 != null) {

int top = mView2.getTop();

ObjectAnimator translateView1 = null;
ObjectAnimator translateView2 = null;

if (mView1.getTranslationY() == 0) {

translateView1 = ObjectAnimator.ofFloat(mView1, "translationY", top);
translateView2 = ObjectAnimator.ofFloat(mView2, "translationY", top*(-1));

} else {

translateView1 = ObjectAnimator.ofFloat(mView2, "translationY", 0);
translateView2 = ObjectAnimator.ofFloat(mView1, "translationY", 0);

}

translateView1.setDuration(1000L);
translateView2.setDuration(1000L);

AnimatorSet alpha1 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
alpha1.setTarget(mView1);

AnimatorSet alpha2 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
alpha2.setTarget(mView2);

AnimatorSet set = new AnimatorSet();
set.playTogether(translateView1, translateView2, alpha1, alpha2);
set.start();

}
}

现在,因为这按预期工作,我想知道如何缩短代码?

  • 是否真的有必要为每个使用 XML 动画的 View 创建一个单独的 AnimatorSet 实例?我可以将 xml 膨胀一次并在不同的 AnimatorSets/ObjectAnimators 上使用它吗?因为我没有找到将 Animator 作为参数的 setter。

  • 我可以为一个 AnimationSet/ObjectAnimator 定义多个目标吗?还是为 View 定义不同的 ObjectAnimators 并在 AnimationSet 中使用它们的唯一方法?

最佳答案

你会想把动画代码放在动画类中......像这样:

public class FadingView extends View {

private ObjectAnimator fade, moveX, moveY;
private AnimatorSet moveSet;

public FadingView(Context context) {
super(context);
}

private void fade(int duration, float...values) {

if(fade==null) {
fade = ObjectAnimator.ofFloat(this, "alpha", values);
} else {
fade.setFloatValues(values);
}
fade.setDuration(duration);
fade.start();

}

private void move(int duration, int x, int y) {

if(moveX==null) {
moveX = ObjectAnimator.ofFloat(this, "translation_x", x);
} else {
moveX.setFloatValues(x);
}
if(moveY==null) {
moveY = ObjectAnimator.ofFloat(this, "translation_y", y);
} else {
moveY.setFloatValues(y);
}
if(moveSet == null) {
moveSet = new AnimatorSet();
moveSet.playTogether(moveX, moveY);
}

moveSet.setDuration(duration);
moveSet.start();

}

public void moveToUpperLeft(int duration) {
move(duration, 0,0);
}

public void show(int duration) {
fade(duration,1);
}

public void hide(int duration) {
fade(duration,0);
}

}

只是一个基本示例,但现在您可以调用:

FadingView view = new FadingView(context);
view.hide(500);
view.moveToUpperLeft(500);

当然你可以进一步定制和泛化这个......

关于android - 如何使这段动画代码更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634394/

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