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

5
我在屏幕中央有一个圆,里面包含一个ImageViewTextView。我还有另外两个ImageView+TextView,一个在屏幕顶部,另一个在底部。 这是UI模型我的要求是:

我想要复制顶部的ImageView+TextView和底部的ImageView+TextView,以动画的方式移动到圆的中心,从而改变圆内的textView的值。

例如:

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

我尝试使用TranslateAnimation,但是我在寻找中心圆的x和y坐标时遇到了问题。它并没有精确地移到圆的中心。而且原始view的位置也没有保留。

    TranslateAnimation animation = new
TranslateAnimation(startLayout.getX(),endLayout.getX(),
startLayout.getY(),endLayout.getY);
                    animation.setDuration(1000);
                    animation.setFillAfter(false);
                    startView.startAnimation(animation);

startLayout是线性布局,在其中ImageView和TextView位于其中。 请帮忙!谢谢!


还没有答案吗? - Rakesh
3个回答

10
我遇到了同样的问题,我通过使用下面的代码解决了它(抱歉是用 Kotlin 写的,但在 Java 中也适用)。假设 viewFirst 想要到达 viewTwo 的位置:
(请勿使用):
               viewFirst.animate()
                        .translationX(viewSecond.x)
                        .translationY(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.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()

0

尝试使用此方法获取准确的坐标

private fun moveView(viewToBeMoved: View, targetView: View) {
val targetX: Float =
    targetView.x + targetView.width / 2 - viewToBeMoved.width / 2
val targetY: Float =
    targetView.y + targetView.height / 2 - viewToBeMoved.height / 2

viewToBeMoved.animate()
    .x(targetX)
    .y(targetY)
    .setDuration(2000)
    .withEndAction {
        targetView.visibility = View.GONE
    }
    .start()

}


0

使用getX()getY()方法定义视图在像素中的位置,但您使用的构造函数定义了必须是0.0f到1.0f值的Float类型值

TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

这是另一种选项,使用视图在像素中的位置:

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接