Hello Android开发人员!
Nota:帖子末尾的所有代码。
我希望只要其中一个子视图通过平滑展开动画变为可见,就可以为其设置动画。
在LayoutTransition
的帮助下,此展开/折叠动画没有问题。
但问题是,动画ViewGroup
是"复合体的一部分" LinearLayout
。
此ViewGroup's
高度设置为wrap_content
,另一个ViewGroup
,动画ViewGroup下方的高度为0dp,权重设置为1以适合屏幕上的所有剩余空间。
每当动画ViewGroup
展开时,由于垂直占用更多空间,底部ViewGroup
应缩小以使顶部ViewGroup
具有所需的扩展空间。我希望这个底部ViewGroup
也能用动画收缩。
不起作用的是,当第一个ViewGroup
上的动画开始时,底部ViewGroup
会立即调整大小。我尝试将LayoutTransition对象添加到底部ViewGroup或全局根ViewGroup,但似乎没有解决问题。
有没有人设法做过这样的动画?我希望这与4.0兼容。 (没有LayoutTransition.CHANGING然后......:s)
感谢您的帮助!
现在代码:
my_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/actionbar_height"
android:background="@drawable/bg_texture_black"
android:orientation="vertical">
<!-- This is the layout with the LayoutTransition instance -->
<LinearLayout
android:id="@+id/layout_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/dimen_margin_xlarge"
android:paddingRight="@dimen/dimen_margin_xlarge"
android:paddingTop="@dimen/dimen_margin_medium"
android:paddingBottom="@dimen/dimen_margin_medium"
android:background="@drawable/bg_black_gradient_to_top"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="@dimen/font_size_xxlarge"
android:text="@string/text_my_documents"/>
<!-- This is the layout with the extra content that is hidden/shown to trigger the animation -->
<RelativeLayout
android:id="@+id/layout_search_parameters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_margin_medium"
android:textColor="@android:color/white"
android:textSize="@dimen/font_size_medium"
android:text="TEST"/>
</RelativeLayout>
</LinearLayout>
<!-- The bottom layout that fit all the remaining space vertically -->
<LinearLayout
android:id="@+id/layout_central"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:background="@color/debug">
</LinearLayout>
</LinearLayout>
MyActivity.java:
// activity initialization is hidden. This method is triggered whenever the title is clicked. It open the extra layout in the header ViewGroup.
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void openSearchParametersView() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
LayoutTransition transitioner = new LayoutTransition();
transitioner.disableTransitionType(LayoutTransition.APPEARING);
transitioner.setStartDelay(LayoutTransition.APPEARING, 0);
transitioner.setStartDelay(LayoutTransition.DISAPPEARING, transitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
transitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);
headerViewGroup.setLayoutTransition(transitioner);
centralViewGroup.setLayoutTransition(new LayoutTransition()); // this does nothing :(
}
searchParametersView.setVisibility(View.VISIBLE);
}