如何在Android中使用动画将一个视图移动到另一个视图?

如何在Android中使用动画将一个视图移动到另一个视图?,android,animation,view,android-animation,layout-animation,Android,Animation,View,Android Animation,Layout Animation,我在屏幕中央有一个圆圈,里面有一个ImageView+TextView。我还有两个ImageView+TextView,一个在屏幕的顶部,另一个在底部。 我的要求是: 我想要一个顶部图像视图+文本视图的副本和一个底部图像视图+文本视图的副本,以便在动画中移动到圆的中心,从而更改圆内文本视图的值 例如: 假设顶部textView的值为200,底部textView的值为300。我希望这些值中的一部分(比如100或150)设置动画并移动到圆中,但原始值200和300应保持在同一位置 我尝试过使用Tra

我在屏幕中央有一个圆圈,里面有一个
ImageView
+
TextView
。我还有两个
ImageView
+
TextView
,一个在屏幕的顶部,另一个在底部。 我的要求是:

我想要一个顶部
图像视图
+
文本视图
的副本和一个底部
图像视图
+
文本视图
的副本,以便在动画中移动到圆的中心,从而更改圆内文本视图的值

例如:

假设顶部textView的值为200,底部textView的值为300。我希望这些值中的一部分(比如100或150)设置动画并移动到圆中,但原始值200和300应保持在同一位置

我尝试过使用
TranslateAnimation
。然而,我面临着寻找中心圆的x和y坐标的问题。它并不是精确到圆的中心。此外,原始
视图的
位置也不会保留

    TranslateAnimation animation = new
TranslateAnimation(startLayout.getX(),endLayout.getX(),
startLayout.getY(),endLayout.getY);
                    animation.setDuration(1000);
                    animation.setFillAfter(false);
                    startView.startAnimation(animation);
startLayout是ImageView和TextView所在的线性布局。
请帮忙!谢谢

我也遇到了同样的问题,我通过使用下一个代码修复了这个问题(抱歉在Kotlin中,但在Java中也是如此)。假设viewFirst想要达到viewTwo的位置:

(不要使用):

(使用此解决方案):

使用
getX()
getY()
方法以像素为单位定义视图的位置,但使用的构造函数定义的浮点类型值必须是0.0f到1.0f之间的值

这是使用视图的像素位置的另一个选项:

viewFirst.animate()
        .x(viewSecond.getX())
        .y(viewSecond.getY())
        .setDuration(1000).withEndAction(new Runnable() {
    @Override
    public void run() {
        viewFirst.setX(tv2.getX());
        viewFirst.setY(tv2.getY());
    }
}).start();

还没有答案吗?
               viewFirst.animate()
                        .x(viewSecond.x)
                        .y(viewSecond.y)
                        .setDuration(1000)
                        .withEndAction {
                        //to make sure that it arrives, 
                        //but not needed actually these two lines
                            viewFirst.x = viewSecond.x
                            viewFirst.y = viewSecond.y
                        }
                        .start()
viewFirst.animate()
        .x(viewSecond.getX())
        .y(viewSecond.getY())
        .setDuration(1000).withEndAction(new Runnable() {
    @Override
    public void run() {
        viewFirst.setX(tv2.getX());
        viewFirst.setY(tv2.getY());
    }
}).start();