Я работаю над приложением Android 4+, которое использует довольно простую компоновку: несколько представлений складываются с использованием LinearLayout
в ScrollView
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="HardcodedText,UseCompoundDrawables,UselessParent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
<!-- Top Container -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
<Button... />
</LinearLayout>
<!-- Hidden Container -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
... Some Content ...
</LinearLayout>
<!-- Bottom Container -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
... Some Content ...
</LinearLayout>
</LinearLayout>
</ScrollView>
HiddenContainer
не должен быть виден при создании макета. Таким образом, в начале BottomContainer
находится непосредственно под TopContainer
. Щелчок по Button
в пределах TopContainer
переключает видимость HiddenContainer
.
Делая это с hiddenContainer.setVisibility(hiddenContainer.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE)
, работает без проблем. Однако это не выглядит хорошо, когда вид внезапно появляется или исчезает. Вместо этого я хотел бы оживить изменение.
Я был удивлен, что мне не удалось найти простое решение для этого:
- Использование
android:animateLayoutChanges="true"
работает, однако я не могу управлять анимацией.
- При использовании
ValueAnimator
для изменения hiddenContainer.setScaleY(...)
дает мне контроль над анимацией setScaleY(0)
делает контейнер невидимым, не уменьшая пространство, которое он занимает в макете.
- Использование
ValueAnimator
для изменения hiddenContainer.setHeight(...)
может работать, однако я не хочу использовать фиксированное значение высоты при отображении контейнера (например, hiddenContainer.setHeight(300)
), но высоту, которая определяется содержимым контейнеров.
Итак, как это решить?