use MaterialContainerTransform for ActionButton animation (#1961)

* use MaterialContainerTransform for ActionButton animation

* fix back button in TabPreferenceActivity
This commit is contained in:
Konrad Pozniak 2020-10-19 14:57:55 +02:00 committed by Alibek Omarov
parent 7063060a2d
commit 8b3c9a8f09
3 changed files with 35 additions and 15 deletions

View File

@ -146,7 +146,7 @@ dependencies {
implementation "androidx.room:room-rxjava2:$roomVersion" implementation "androidx.room:room-rxjava2:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion" kapt "androidx.room:room-compiler:$roomVersion"
implementation "com.google.android.material:material:1.2.0" implementation "com.google.android.material:material:1.2.1"
implementation 'com.google.android:flexbox:2.0.1' implementation 'com.google.android:flexbox:2.0.1'
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"

View File

@ -15,19 +15,25 @@
package com.keylesspalace.tusky package com.keylesspalace.tusky
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.MenuItem import android.view.MenuItem
import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import at.connyduck.sparkbutton.helpers.Utils import at.connyduck.sparkbutton.helpers.Utils
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
import com.keylesspalace.tusky.adapter.ItemInteractionListener import com.keylesspalace.tusky.adapter.ItemInteractionListener
import com.keylesspalace.tusky.adapter.ListSelectionAdapter import com.keylesspalace.tusky.adapter.ListSelectionAdapter
import com.keylesspalace.tusky.adapter.TabAdapter import com.keylesspalace.tusky.adapter.TabAdapter
@ -129,19 +135,17 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
touchHelper.attachToRecyclerView(currentTabsRecyclerView) touchHelper.attachToRecyclerView(currentTabsRecyclerView)
actionButton.setOnClickListener { actionButton.setOnClickListener {
actionButton.isExpanded = true toggleFab(true)
} }
scrim.setOnClickListener { scrim.setOnClickListener {
actionButton.isExpanded = false toggleFab(false)
} }
maxTabsInfo.text = getString(R.string.max_tab_number_reached, MAX_TAB_COUNT) maxTabsInfo.text = getString(R.string.max_tab_number_reached, MAX_TAB_COUNT)
updateAvailableTabs() updateAvailableTabs()
} }
override fun onTabAdded(tab: TabData) { override fun onTabAdded(tab: TabData) {
@ -150,7 +154,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
return return
} }
actionButton.isExpanded = false toggleFab(false)
if (tab.id == HASHTAG) { if (tab.id == HASHTAG) {
showAddHashtagDialog() showAddHashtagDialog()
@ -188,6 +192,22 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
currentTabsAdapter.notifyItemChanged(tabPosition) currentTabsAdapter.notifyItemChanged(tabPosition)
} }
private fun toggleFab(expand: Boolean) {
val transition = MaterialContainerTransform().apply {
startView = if (expand) actionButton else sheet
val endView: View = if (expand) sheet else actionButton
this.endView = endView
addTarget(endView)
scrimColor = Color.TRANSPARENT
setPathMotion(MaterialArcMotion())
}
TransitionManager.beginDelayedTransition(tabPreferenceContainer, transition)
actionButton.visible(!expand)
sheet.visible(expand)
scrim.visible(expand)
}
private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) { private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {
val frameLayout = FrameLayout(this) val frameLayout = FrameLayout(this)
@ -322,10 +342,10 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
} }
override fun onBackPressed() { override fun onBackPressed() {
if (actionButton.isExpanded) { if (actionButton.isVisible) {
actionButton.isExpanded = false
} else {
super.onBackPressed() super.onBackPressed()
} else {
toggleFab(false)
} }
} }

View File

@ -2,6 +2,7 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tabPreferenceContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -19,8 +20,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/scrimBackground" android:background="?attr/scrimBackground"
android:visibility="invisible" android:visibility="invisible" />
app:layout_behavior="@string/fab_transformation_scrim_behavior" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/actionButton" android:id="@+id/actionButton"
@ -30,7 +30,7 @@
android:layout_margin="16dp" android:layout_margin="16dp"
android:src="@drawable/ic_plus_24dp" /> android:src="@drawable/ic_plus_24dp" />
<com.google.android.material.transformation.TransformationChildCard <com.google.android.material.card.MaterialCardView
android:id="@+id/sheet" android:id="@+id/sheet"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -38,8 +38,7 @@
android:layout_margin="16dp" android:layout_margin="16dp"
android:visibility="invisible" android:visibility="invisible"
app:cardBackgroundColor="?attr/colorSurface" app:cardBackgroundColor="?attr/colorSurface"
app:cardElevation="2dp" app:cardElevation="2dp">
app:layout_behavior="@string/fab_transformation_sheet_behavior">
<LinearLayout <LinearLayout
android:layout_width="240dp" android:layout_width="240dp"
@ -76,6 +75,7 @@
android:textColor="?attr/colorOnPrimary" android:textColor="?attr/colorOnPrimary"
android:textSize="?attr/status_text_large" /> android:textSize="?attr/status_text_large" />
</LinearLayout> </LinearLayout>
</com.google.android.material.transformation.TransformationChildCard>
</com.google.android.material.card.MaterialCardView>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>