动画后更新视图位置

时间:2014-11-14 20:54:09

标签: android android-layout android-animation

我正在努力让动画工作。我正在从屏幕中间移动搜索栏到屏幕顶部。动画效果很好,但一旦移动我就无法与任何东西互动。我已经更新了位置,但无论如何都无法与之交互。这是我到目前为止所得到的:

private void moveSearchToTop()
{
    FrameLayout root = (FrameLayout) findViewById( R.id.rootLayout );
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics( dm );
    statusBarOffset = dm.heightPixels - root.getMeasuredHeight();

    int originalPos[] = new int[2];
    mSearchBar.getLocationOnScreen( originalPos );

    search_top = statusBarOffset - originalPos[1];
    TranslateAnimation anim = new TranslateAnimation( 0, 0, 0, search_top);
    anim.setDuration(500);
    anim.setFillAfter(true);
    anim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            mSearchBar.layout(0, search_top, 0, mSearchBar.getHeight() + search_top);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

    mSearchBar.startAnimation(anim);
}

以下是xml中的视图:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:id="@+id/search_bar"
    android:background="@android:drawable/dialog_holo_light_frame">
    <ImageView
        android:id="@+id/search_icon"
        android:layout_width="wrap_content"
        android:onClick="onSearchClick"
        android:layout_height="25dp"
        android:layout_gravity="center_vertical"
        android:src="@drawable/search"/>
    <EditText
        android:id="@+id/search_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:singleLine="true"
        android:hint="Search"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:layout_gravity="center_vertical"
        android:src="@drawable/camera"/>
    </LinearLayout>

我是否还需要更新所有子元素的位置?感谢您推动合适的位置。

1 个答案:

答案 0 :(得分:0)

不,您不需要修改子视图。他们会去搜索栏去的地方。

在我看来,您将search_top变量用作delta(用于TranslateAnimation构造函数)和作为其父级中的位置(在布局调用中)。它实际上是一个增量,因此对布局的调用是不正确的。

您的searchBar的父级是“root”FrameLayout吗?如果是这样,那么您只想在布局调用中使用0作为新的y坐标。此外,您使用0作为右坐标,这意味着它在动画后没有宽度。此调用会将搜索栏定位在其父级的左上角,并保持其当前宽度和高度:

 mSearchBar.layout(0, 0, mSearchBar.getWidth(), mSearchBar.getHeight());

我还建议您不要使用屏幕位置。在父视图中设置视图的位置更安全。例如,如果搜索栏的父级确实是root,那么您可以使用以下内容获取delta:

search_top = - mSearchBar.getTop();