Я работаю над анимацией, когда пользователь нажимает на значок «Избранное», другой вид будет скользить вверх вниз, а затем скользить вниз (Показать и скрыть).
Проблема: я использую обработчик, который может вызвать утечку памяти, я ищу хороший подход. Если я не использую обработчик, он правильно перемещается вверх, но правильно скрывается, просто скрывается. Я использую это представление в адаптере для элементов.
XML:
Kotlin: ViewState.kt
class ViewState {
@Bindable
var addedToFavoritesVisibility: Int = View.GONE
set(value) {
field = value
notifyPropertyChanged(BR.addedToFavoritesVisibility)
}
fun favoriteClicked(button: Button, boolean: Boolean, visibility: Int = View.VISIBLE) {
favorite = boolean
val transitionListener = object : Transition.TransitionListener {
override fun onTransitionEnd(transition: Transition) {
transition.removeListener(this)
android.os.Handler().postDelayed({ favoriteClicked(button, favorite, visibility = View.GONE) }, 1000)
}
override fun onTransitionResume(transition: Transition) {}
override fun onTransitionPause(transition: Transition) {}
override fun onTransitionCancel(transition: Transition) {}
override fun onTransitionStart(transition: Transition) {}
}
val transition: Transition = Slide().apply {
slideEdge = Gravity.BOTTOM
duration = animationDuration
addTarget(R.id.tv_added_to_favorites)
if (visibility == View.VISIBLE) {
addListener(transitionListener)
}
}
TransitionManager.beginDelayedTransition(button.parent.parent as ViewGroup, transition)
addedToFavoritesVisibility = visibility
}
}
XML file:
<?xml version="1.0" encoding="utf-8"?>
<layout 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:id="@+id/layout">
<data>
<import type="android.view.View" />
<variable
name="viewState"
type="com.xyz.ViewState" />
</data>
<androidx.cardview.widget.CardView
android:layout_width="280dp"
android:layout_height="260dp"
android:layout_marginTop="@dimen/spacing_2"
android:layout_marginBottom="@dimen/spacing_2"
app:cardCornerRadius="@dimen/spacing_8">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true">
<ToggleButton
style="@style/ThriveMarket.Style.Favorite.Toggle.Large.Green"
android:layout_gravity="center"
android:checked="@{viewState.favorite}"
android:onCheckedChanged="@{(button, bool)-> viewState.favoriteClicked(button, bool, View.VISIBLE)}" />
</FrameLayout>
<TextView
android:id="@+id/tv_added_to_favorites"
background:"@color/black"
android:layout_width="match_parent"
android:layout_height="42dp"
android:background="@color/green"
android:gravity="center"
android:text="@string/tm_added_to_favorites"
android:visibility="@{viewState.addedToFavoritesVisibility}"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</layout>
Мне интересно, что если мне не хватает чего-то похожего на API-интерфейсы Animation, которые поддерживают показ / скрытие в одном переходе? Заранее спасибо.