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

时间:2017-05-27 04:23:47

标签: android animation view android-animation layout-animation

我在屏幕中央有一个圆圈,其中有一个a[i] = ch + ImageView。我还有两个TextView + ImageView,一个在屏幕顶部,另一个在屏幕底部。 Here's the UI mockup我的要求是:

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

例如:

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

我尝试过使用TextView。但是我遇到了找到中心圆的x和y坐标的问题。它并不完全是圆圈的中心。原始TranslateAnimation位置也不会保留。

view's

startLayout是ImageView和TextView所在的linearlayout。 请帮忙!谢谢!

2 个答案:

答案 0 :(得分:3)

我有同样的问题,我使用下一个代码修复(抱歉在Kotlin,但在Java中的工作原理相同)。让我们说viewFirst想要达到viewTwo位置:

(DON' T使用):

from x in JustMyCode.Members
where (x.IsMethod && x.AsMethod.IsPropertyGetter &&
       x.AsMethod.ReturnTypeIs("System.String")) ||
      (x.IsField && x.AsField.FieldTypeIs("System.String"))
select x

(使用此解决方案):

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

答案 1 :(得分:0)

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

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