动画结束视图坐标与开始时相同

时间:2018-01-20 14:43:40

标签: android android-animation

我有以下布局,其中包含同一父级中的两个EditText

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

<EditText
    android:id="@+id/et_profession"
    android:hint="Profession"
    android:imeOptions="actionNext"
    android:layout_marginLeft="32dp" android:layout_marginRight="32dp"
    android:layout_width="match_parent" android:layout_height="48dp" android:inputType="text"
    tools:ignore="LabelFor" />

<EditText
    android:id="@+id/et_company"
    android:hint="Company"
    android:visibility="invisible"
    android:layout_marginLeft="32dp" android:layout_marginRight="32dp"
    android:layout_width="match_parent" android:layout_height="48dp" android:inputType="text"
    tools:ignore="LabelFor" />

</LinearLayout>

我想要的是当用户按下键盘上的下一个动作按钮以获得第一个editText时,将第二个editText设置为第一个的位置。

这就是代码我是如何做到的:

private void startCompanyAnim() {
    etCompany.animate()
            .setDuration(2000L)
            .setListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                    etCompany.setVisibility(VISIBLE);
                    Log.i("ANIM", "START : prof.TOP == " + etProfession.getTop() + " and comp.TOP == " + etCompany.getTop());
                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    Log.i("ANIM", "END : prof.TOP == " + etProfession.getTop() + " and comp.TOP == " + etCompany.getTop());
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            })
            .translationY(etProfession.getTop() - etCompany.getTop())
            .start();
}

虽然这似乎有效,而第二个视图位于第一个视图之上,但问题是当我记录第二个editText的getTop()值时,它与动画之前的值相同。 / p>

例如,这是我在logcat上得到的:

01-20 09:08:25.646 2014-2014/com.anim.androidanimations I/ANIM: START : prof.TOP == 0 and comp.TOP == 72
 01-20 09:08:27.655 2014-2014/com.anim.androidanimations I/ANIM: END : prof.TOP == 0 and comp.TOP == 72

第二个视图getTop()的已记录onAnimationEnd()不应该与第一个视图的值{{1}}相同吗?此外,因为我可以在我的设备屏幕上看到它确实在第一个为什么它给我与动画之前相同的值?

2 个答案:

答案 0 :(得分:1)

尝试更改如下:

private void startCompanyAnim() {
    etCompany.animate()
            // ...
            .yBy(etProfession.getTop() - etCompany.getTop())
            .start();
}

这会直接影响Y属性。

答案 1 :(得分:1)

在您的情况下,这是一种简单的方法。

 @Override
 public void onAnimationEnd(Animator animation) {
    etCompany.layout(etProfession.getLeft(),etProfession.getTop(),etProfession.getRight(),etProfession.getBottom());
    Log.i("ANIM", "END : prof.TOP == " + etProfession.getTop() + " and comp.TOP == " + etCompany.getTop());
     }