如何使用android动画移动/更改对象的方向?

如何使用android动画移动/更改对象的方向?,android,animation,Android,Animation,我正在尝试用android制作一个简单的“乒乓球”应用程序,但是我找不到一个模式来重复基本的动画,比如 TranslateAnimation(fromX,toX,fromY,toY); 我想让一个球在屏幕边界上弹跳,如何动态改变方向?首先,对于乒乓球游戏,我强烈建议您使用自定义视图进行渲染。也就是说,您可以通过编程方式创建动画实例,以便计算x和y值。 假设你有一个这样的布局 <?xml version="1.0" encoding="utf-8"?> <FrameLayout

我正在尝试用android制作一个简单的“乒乓球”应用程序,但是我找不到一个模式来重复基本的动画,比如

TranslateAnimation(fromX,toX,fromY,toY);

我想让一个球在屏幕边界上弹跳,如何动态改变方向?

首先,对于乒乓球游戏,我强烈建议您使用自定义视图进行渲染。也就是说,您可以通过编程方式创建
动画
实例,以便计算x和y值。 假设你有一个这样的布局

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

    <View
        android:id="@+id/view"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:background="#ffff0000" />

</FrameLayout>
y
坐标在0和1之间交替,因为球(以及正方形)上下移动。
x
只是一个随机值

x
y
值是父级大小的百分比


当动画结束时,您只需使用新的目标坐标开始一个新的动画。

我已更新了答案,请检查并回答..如果可行@Gianluca谢谢你的回答,但是课堂主要活动是用wich语言写的?我使用的是android studio,这不是java。对不起,我的无知:(不用担心,这是Kotlin,Android Studio 3完全支持它。它比java好得多,我建议您尝试一下。如果您在运行我的示例时遇到问题,请告诉我,我会将其更新为java谢谢您对Kotlin的建议,但现在我将使用java让我的教授高兴。哈哈,我还有最后一个问题,pou是什么rpose of animation.setAnimationListener(this)?animation listener是一个有3种方法(onAnimationStart、onAnimationRepeat、onAnimationEnd)的接口。如果将侦听器设置为动画,则会调用相应的方法,以便您可以执行某些操作。例如,在我们的示例中,当动画完成时,会调用onAnimationEnd,我们可以计算新坐标并启动新动画
class MainActivity : AppCompatActivity(), Animation.AnimationListener {

    private lateinit var view: View
    private var viewX = 0f
    private var viewY = 0f
    private var dstX = 0f
    private var dstY = 0f

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        view = findViewById(R.id.view)
        startViewAnimation()
    }

    private fun startViewAnimation(){
        dstX = Random().nextFloat()
        dstY = if (viewY == 1f) 0f else 1f

        val animation = TranslateAnimation(
                Animation.RELATIVE_TO_PARENT, viewX,
                Animation.RELATIVE_TO_PARENT, dstX,
                Animation.RELATIVE_TO_PARENT, viewY,
                Animation.RELATIVE_TO_PARENT, dstY
        )
        animation.duration = 1000L
        animation.setAnimationListener(this)
        animation.fillAfter = true
        view.startAnimation(animation)
    }

    override fun onAnimationEnd(animation: Animation?) {
        viewX = dstX
        viewY = dstY
        startViewAnimation()
    }

    override fun onAnimationStart(animation: Animation?) = Unit
    override fun onAnimationRepeat(animation: Animation?) = Unit

}