5

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

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

例如:

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

我试过使用TranslateAnimation. 但是,我在寻找中心圆的 x 和 y 坐标时遇到问题。它并不完全到达圆的中心。view's也不保留原来的位置。

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

startLayout 是 ImageView 和 TextView 所在的线性布局。请帮忙!谢谢!

4

3 回答 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()
于 2017-12-01T12:32:05.080 回答
0

使用getX()andgetY()方法以像素为单位定义视图的位置,但您使用的构造函数定义了 Float 类型值,该值必须是从 0.0f 到 1.0f 的值

TranslateAnimation(从XDelta浮动,从XDelta浮动,从YDelta浮动,从YDelta浮动)

这是另一个使用视图位置(以像素为单位)的选项:

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();
于 2020-07-30T19:05:55.200 回答
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()

}

于 2022-01-22T11:23:10.480 回答