У меня есть фрагмент с выравниванием снизу к активности, которая занимает только часть экрана. Во фрагменте есть вид, который отображается и скрывается после щелчка.
До сих пор root вид во фрагменте имел android:animateLayoutChanges="true"
, но в анимации присутствуют такие же артефакты, как прыжки.
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/buttonsView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:focusable="true"
android:descendantFocusability="afterDescendants"
android:visibility="gone"
tools:visibility="visible">
<!-- same buttons -->
</RelativeLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:orientation="vertical"
android:id="@+id/rowContainer"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- row items -->
</androidx.appcompat.widget.LinearLayoutCompat>
Для улучшения анимации я стараюсь:
- использовать TransitionManager
TransitionManager.beginDelayedTransition(binding.rowContainer)
binding.rowContainer.visibility = View.VISIBLE
поставить вышеупомянутый пользовательский переход:
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together">
<changeBounds android:duration="5000" />
<slide android:duration="5000"
android:slideEdge="bottom"
android:startDelay="0"/>
</transitionSet>
, но это вызывает только то, что задержка сдвигается внутрь.
val slideIn = AnimationUtils.loadAnimation(context, R.anim.slide_in_bottom)
binding.rowContainer.startAnimation(slideIn)
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="600"
android:fromYDelta="50%p"
android:toYDelta="0" />
<alpha
android:duration="600"
android:fromAlpha="0.5"
android:toAlpha="1.0" />
</set>
аналогичный результат.
Так как скользить из нижнего фрагмента без переходов, которые находятся над отображением? точно так же, как это другой элемент в списке, который перемещается на один элемент вверх.