我正在努力让动画工作。我正在从屏幕中间移动搜索栏到屏幕顶部。动画效果很好,但一旦移动我就无法与任何东西互动。我已经更新了位置,但无论如何都无法与之交互。这是我到目前为止所得到的:
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>
我是否还需要更新所有子元素的位置?感谢您推动合适的位置。
答案 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();