隐藏另一个视图时拉长视图
Elongate View when another one is being hidden
我目前正在尝试实现某个动画:
我有一个视图(LinearLayout)应该在按下 fab 按钮时隐藏/显示,并且该视图(LinearLayout)下方的视图(RecyclerView)应该拉长或缩短以使其再次适合屏幕。 LinearLayout 被向上推,因此下面的 RecyclerView 应该以完美的方式伸长,看起来它们会粘在一起。
目前我有如下所示的自定义动画:
slide_down.xml
<translate
android:duration="1000"
android:fromYDelta="-100%"
android:toYDelta="0" />
slide_up.xml
<translate
android:duration="1000"
android:fromYDelta="0"
android:toYDelta="-100%"/>
布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.chrono.worker.TabbedActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginBottom="?attr/actionBarSize">
<!-- THIS ONE IS THE LINEAR LAYOUT I WAS TALKING ABOUT -->
<LinearLayout
android:id="@+id/ll_search_whole"
android:layout_width="match_parent"
android:layout_height="@dimen/search_grid"
android:animateLayoutChanges="true"
android:background="@color/colorPrimary"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="2dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="2dp"
android:weightSum="2">
<!-- took out some code here -->
</LinearLayout>
</LinearLayout>
<!-- THIS IS THE RECYCLERVIEW -->
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_below="@id/ll_search_whole"
>
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
尽管如此,RecyclerView 表现迟缓并且根本不依赖于 LinearLayout。
如何实现我想要的动画效果?
为什么不使用 Transitions 框架?对于这种方法,父 RelativeLayout
需要一个 id,我们假设它是 android:id="@+id/sceneRoot"
。
我们将所有相关的 View
设置为 Activity
/ Fragment
:
的字段
private ViewGroup sceneRoot = (ViewGroup)findViewById(R.id.sceneRoot);
private View ll_search_whole = findViewById(R.id.ll_search_whole);
下面是隐藏 LinearLayout
的方法:
TransitionSet tSet = new TransitionSet();
tSet.addTransition(new Fade());
tSet.addTransition(new ChangeBounds());
TransitionManager.beginDelayedTransition(sceneRoot, tSet);
ll_search_whole.setVisibility(View.GONE);
这应该会产生流畅的动画效果。如果 ViewGroup
像 RecyclerView
转换那样有点迟钝,可以尝试对它们调用 setTransitionGroup(true);
。
我目前正在尝试实现某个动画: 我有一个视图(LinearLayout)应该在按下 fab 按钮时隐藏/显示,并且该视图(LinearLayout)下方的视图(RecyclerView)应该拉长或缩短以使其再次适合屏幕。 LinearLayout 被向上推,因此下面的 RecyclerView 应该以完美的方式伸长,看起来它们会粘在一起。
目前我有如下所示的自定义动画:
slide_down.xml
<translate
android:duration="1000"
android:fromYDelta="-100%"
android:toYDelta="0" />
slide_up.xml
<translate
android:duration="1000"
android:fromYDelta="0"
android:toYDelta="-100%"/>
布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.chrono.worker.TabbedActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginBottom="?attr/actionBarSize">
<!-- THIS ONE IS THE LINEAR LAYOUT I WAS TALKING ABOUT -->
<LinearLayout
android:id="@+id/ll_search_whole"
android:layout_width="match_parent"
android:layout_height="@dimen/search_grid"
android:animateLayoutChanges="true"
android:background="@color/colorPrimary"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="2dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="2dp"
android:weightSum="2">
<!-- took out some code here -->
</LinearLayout>
</LinearLayout>
<!-- THIS IS THE RECYCLERVIEW -->
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_below="@id/ll_search_whole"
>
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
尽管如此,RecyclerView 表现迟缓并且根本不依赖于 LinearLayout。
如何实现我想要的动画效果?
为什么不使用 Transitions 框架?对于这种方法,父 RelativeLayout
需要一个 id,我们假设它是 android:id="@+id/sceneRoot"
。
我们将所有相关的 View
设置为 Activity
/ Fragment
:
private ViewGroup sceneRoot = (ViewGroup)findViewById(R.id.sceneRoot);
private View ll_search_whole = findViewById(R.id.ll_search_whole);
下面是隐藏 LinearLayout
的方法:
TransitionSet tSet = new TransitionSet();
tSet.addTransition(new Fade());
tSet.addTransition(new ChangeBounds());
TransitionManager.beginDelayedTransition(sceneRoot, tSet);
ll_search_whole.setVisibility(View.GONE);
这应该会产生流畅的动画效果。如果 ViewGroup
像 RecyclerView
转换那样有点迟钝,可以尝试对它们调用 setTransitionGroup(true);
。