gpt4 book ai didi

java - 在 android 上为对象设置动画后应用转换

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:11 27 4
gpt4 key购买 nike

我正在尝试为进入屏幕的球图像制作动画,在屏幕内移动位置并返回屏幕外。我想以 3 个动画的形式执行此操作; ball_in、ball_shift 和 ball_out,以及能够决定何时从一个动画转到另一个动画。

这是我目前得到的代码;

主.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView android:id="@+id/ballImage" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="5px"
android:src="@drawable/red_ball"
/>


</RelativeLayout>

主要 Activity

public class AnimationTest extends Activity
{
AnimationDrawable ballAnimation;

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final ImageView ballImage = (ImageView) findViewById(R.id.ballImage);

final Animation ballOutAnimation = AnimationUtils.loadAnimation(this, R.anim.ball_out);

final Animation ballShiftAnimation = AnimationUtils.loadAnimation(this, R.anim.ball_shift);
ballShiftAnimation.setAnimationListener( new AnimationListener()
{

@Override
public void onAnimationEnd(
Animation animation) {

ballImage.startAnimation(ballOutAnimation);
}

@Override
public void onAnimationRepeat(
Animation animation) {}

@Override
public void onAnimationStart(
Animation animation) {}

});

final Animation ballInAnimation = AnimationUtils.loadAnimation(this, R.anim.ball_in);
ballInAnimation.setAnimationListener( new AnimationListener()
{

@Override
public void onAnimationEnd(
Animation animation) {
ballImage.startAnimation(ballShiftAnimation);
}

@Override
public void onAnimationRepeat(
Animation animation) {}

@Override
public void onAnimationStart(
Animation animation) {}

});

ballImage.startAnimation(ballInAnimation);

}

}

ball_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:fromXDelta="150"
android:toXDelta="0"

android:fromYDelta="0"
android:toYDelta="0"

android:duration="2000"
android:startOffset="0"
/>

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:fromXDelta="0"
android:toXDelta="0"

android:fromYDelta="-150"
android:toYDelta="0"

android:duration="1500"
android:startOffset="500"
/>

</set>

</set>

ball_shift.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:fromXDelta="0"
android:toXDelta="130"

android:fromYDelta="0"
android:toYDelta="220"

android:duration="2000"
android:startOffset="0"

android:fillAfter="true"
/>

<scale
android:fromXScale="1.0"
android:toXScale="0.623"

android:fromYScale="1.0"
android:toYScale="0.623"

android:duration="2000"
android:startOffset="0"

android:fillAfter="true"
/>

</set>

ball_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<scale
android:fromXScale="0.623"
android:toXScale="0.623"

android:fromYScale="0.623"
android:toYScale="0.623"
/>

<translate
android:fromXDelta="130"
android:toXDelta="330"

android:duration="2000"
android:startOffset="0"
/>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:fromYDelta="220"
android:toYDelta="370"

android:duration="1900"
android:startOffset="100"
/>

</set>

</set>

我最初将所有内容都放在一个长动画中,但我想将动画拆分以便能够在代码中的给定时间停止和继续。这样做,我意识到当动画完成时图像的位置被重置回起始位置,这当然在拆分动画时给我带来了奇怪的结果。

我尝试使用 fillAfter/fillBefore,这被描述为在动画过程之后/之前应用转换,但它们似乎对图像没有任何作用。它仍然会重置回起始位置。

有关如何执行此操作的任何帮助或建议均适用。谢谢。

最佳答案

你应该使用 AnimationSet用于在 android 中以编程方式连接动画。它应该看起来像这样

AnimationSet anim = new AnimationSet(false);

final Animation ballInAnimation = AnimationUtils.loadAnimation(this,
R.anim.ball_in);
ballInAnimation.setFillBefore(true);

final Animation ballShiftAnimation = AnimationUtils.loadAnimation(this,R.anim.ball_shift);
ballShiftAnimation.setStartOffset(ballInAnimation.getDuration());

final Animation ballOutAnimation = AnimationUtils.loadAnimation(this,R.anim.ball_out);
ballOutAnimation.setStartOffset(ballInAnimation.getDuration()+ ballShiftAnimation.getDuration());

anim.addAnimation(ballInAnimation);
anim.addAnimation(ballShiftAnimation);
anim.addAnimation(ballOutAnimation);
anim.setFillAfter(true);

ballImage.startAnimation(anim);

如果您在 XML 中定义的 TweenAnimations 已正确连接,这应该可以工作。请注意,这只会在视觉上起作用,如果您需要可点击的 View ,您应该使用 ValueAnimator而不是动画

关于java - 在 android 上为对象设置动画后应用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4133731/

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