From 78421ec79fc8228a93c5945704ce7da9095aed0c Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Fri, 24 Apr 2020 20:37:03 +0200 Subject: [PATCH] improve gallery transition and fix crash --- .../evmap/fragment/GalleryFragment.kt | 11 +--------- .../vonforst/evmap/fragment/MapFragment.kt | 22 +++++++++++++++++++ .../res/transition/map_exit_transition.xml | 12 ++++++++++ 3 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/transition/map_exit_transition.xml diff --git a/app/src/main/java/net/vonforst/evmap/fragment/GalleryFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/GalleryFragment.kt index 156644ee..7d8d23fb 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/GalleryFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/GalleryFragment.kt @@ -14,7 +14,6 @@ import com.ortiz.touchview.TouchImageView import net.vonforst.evmap.MapsActivity import net.vonforst.evmap.R import net.vonforst.evmap.adapter.GalleryAdapter -import net.vonforst.evmap.adapter.galleryTransitionName import net.vonforst.evmap.api.goingelectric.ChargerPhoto import net.vonforst.evmap.databinding.FragmentGalleryBinding import net.vonforst.evmap.viewmodel.GalleryViewModel @@ -103,15 +102,7 @@ class GalleryFragment : Fragment(), MapsActivity.FragmentCallback { ) { if (isReturning) { val currentPage = currentPage ?: return - val index = binding.gallery.currentItem - - if (startingPosition != currentPosition) { - names.clear() - names.add(galleryTransitionName(index)) - - sharedElements.clear() - sharedElements[galleryTransitionName(index)] = currentPage - } + sharedElements[names[0]] = currentPage } } } diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index 22971f2e..93fd2377 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -10,6 +10,7 @@ import android.content.res.Configuration import android.os.Bundle import android.view.* import android.view.inputmethod.InputMethodManager +import androidx.core.app.SharedElementCallback import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.databinding.DataBindingUtil @@ -24,6 +25,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.ui.setupWithNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager +import androidx.transition.TransitionInflater import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import com.google.android.gms.maps.CameraUpdateFactory @@ -106,6 +108,10 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac insets } + setExitSharedElementCallback(exitElementCallback) + exitTransition = TransitionInflater.from(requireContext()) + .inflateTransition(R.transition.map_exit_transition) + return binding.root } @@ -495,4 +501,20 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac override fun getRootView(): View { return root } + + private val exitElementCallback: SharedElementCallback = object : SharedElementCallback() { + override fun onMapSharedElements( + names: MutableList, + sharedElements: MutableMap + ) { + // Locate the ViewHolder for the clicked position. + val position = galleryVm.galleryPosition.value ?: return + + val vh = binding.gallery.findViewHolderForAdapterPosition(position) + if (vh?.itemView == null) return + + // Map the first shared element name to the child ImageView. + sharedElements[names[0]] = vh.itemView + } + } } \ No newline at end of file diff --git a/app/src/main/res/transition/map_exit_transition.xml b/app/src/main/res/transition/map_exit_transition.xml new file mode 100644 index 00000000..e1e95d71 --- /dev/null +++ b/app/src/main/res/transition/map_exit_transition.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file