Skip to content

Commit 48d6fd3

Browse files
fix: Tutorial 2-5
1 parent 0ba5f20 commit 48d6fd3

20 files changed

+535
-167
lines changed

External-Tutorial-GridToPager/src/main/java/com/google/samples/gridtopager/fragment/GridFragment.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ public void onMapSharedElements(List<String> names, Map<String, View> sharedElem
125125

126126
System.out.println("🎃 setExitSharedElementCallback() " +
127127
" thisFragment: " + thisFragment.getClass().getSimpleName() +
128-
" viewBefore: " + (viewBefore != null ? viewBefore.hashCode() : -1) +
128+
"\nMainActivity.currentPosition: " + MainActivity.currentPosition+
129+
"\nviewBefore: " + (viewBefore != null ? viewBefore.hashCode() : -1) +
129130
"\nviewAfter: " + (viewAfter != null ? viewAfter.hashCode() : -1));
130131
}
131132
});

External-Tutorial-GridToPager/src/main/java/com/google/samples/gridtopager/fragment/ImagePagerFragment.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,21 @@
1717
package com.google.samples.gridtopager.fragment;
1818

1919
import android.os.Bundle;
20-
21-
import androidx.annotation.Nullable;
22-
import androidx.fragment.app.Fragment;
23-
import androidx.core.app.SharedElementCallback;
24-
import androidx.viewpager.widget.ViewPager;
25-
2620
import android.transition.Transition;
2721
import android.transition.TransitionInflater;
2822
import android.view.LayoutInflater;
2923
import android.view.View;
3024
import android.view.ViewGroup;
3125
import android.widget.Toast;
3226

27+
import androidx.annotation.Nullable;
28+
import androidx.core.app.SharedElementCallback;
29+
import androidx.fragment.app.Fragment;
30+
import androidx.viewpager.widget.ViewPager;
31+
3332
import com.google.samples.gridtopager.MainActivity;
34-
import com.google.samples.gridtopager.adapter.ImagePagerAdapter;
3533
import com.google.samples.gridtopager.R;
34+
import com.google.samples.gridtopager.adapter.ImagePagerAdapter;
3635

3736
import java.util.List;
3837
import java.util.Map;
@@ -113,7 +112,8 @@ public void onMapSharedElements(List<String> names, Map<String, View> sharedElem
113112

114113
System.out.println("👻 setEnterSharedElementCallback() " +
115114
" thisFragment: " + thisFragment.getClass().getSimpleName() +
116-
" viewBefore: " + (viewBefore != null ? viewBefore.hashCode() : -1) +
115+
"\nMainActivity.currentPosition: " + MainActivity.currentPosition+
116+
"\nviewBefore: " + (viewBefore != null ? viewBefore.hashCode() : -1) +
117117
"\nviewAfter: " + (viewAfter != null ? viewAfter.hashCode() : -1));
118118
}
119119
});

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ ExitSharedElementCallback is triggered in first Activity, in second Activity Ent
287287
* 🔥🔥🔥 Make sure that you are importing ```androidx.transition```, do NOT import *android.transition* components,
288288
mixing different import packages causes ***Wrong Transition Exception***
289289
* exitTransition, enterTransition, returnTransition and reEnterTransitions are null for fragments by default.
290+
290291
* 🔥🔥 Setting allowReturnTransitionOverlap to false lets this fragment's reenterTransition to wait previous fragment's returnTransition to finish
291292
* add sharedElement to fragments with ```addSharedElement(ivPhoto, ivPhoto.transitionName)```
292293
and use ```setReorderingAllowed(true)``` to optimize for shared element transition
@@ -304,6 +305,17 @@ val extras = FragmentNavigatorExtras(
304305
findNavController().navigate(direction, extras)
305306
```
306307

308+
* 🔥🔥🔥 With transitions, it's required for start and end values to be different from each other to call
309+
```createAnimator``` method.
310+
311+
To make sure that it gets called, either set **captureStartValues**
312+
and **captureEndValues** manually, or in fragment transitioned to, create ** setEnterSharedElementCallback**
313+
and override **onSharedElementStart** and **onSharedElementEnd** methods and set properties of
314+
objects that are not shared in both fragments.
315+
316+
Without doing this enter or exit might not work because
317+
of ***Transition*** start and end point to same value.
318+
307319
### Resources and References
308320
Wonderful and very helpful resources, check them out 🤩😍
309321

Tutorial3-1Transitions/src/main/java/com/smarttoolfactory/tutorial3_1transitions/adapter/model/MagazineModel.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ import kotlinx.android.parcel.Parcelize
88
data class MagazineModel(
99
@DrawableRes val drawableRes: Int,
1010
val title: String,
11-
val body: String
12-
) : Parcelable
11+
val body: String,
12+
val transitionId: Int = 0
13+
) : Parcelable {
14+
var transitionName = "tr$drawableRes$transitionId"
15+
}

Tutorial3-1Transitions/src/main/java/com/smarttoolfactory/tutorial3_1transitions/adapter/viewholder/MagazineListViewBinder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class MagazineListViewHolder(
7070
false,
7171
3,
7272
0f,
73-
ratio = 2f
73+
ratio = 1.8f
7474
)
7575
}
7676

Tutorial3-1Transitions/src/main/java/com/smarttoolfactory/tutorial3_1transitions/adapter/viewholder/MagazineViewBinder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class MagazineViewHolder(
5151
fun bind(model: MagazineModel) {
5252

5353
// 🔥 Set transition name to resource to drawable
54-
binding.ivMagazineCover.transitionName = "${model.drawableRes}"
54+
binding.ivMagazineCover.transitionName = model.transitionName
5555
setImageUrl(binding.ivMagazineCover, model.drawableRes)
5656

5757
binding.tvMagazineTitle.transitionName = model.title

Tutorial3-1Transitions/src/main/java/com/smarttoolfactory/tutorial3_1transitions/chapter2_fragment_transitions/Fragment2_4MagazineDetail.kt

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.view.animation.AccelerateDecelerateInterpolator
99
import android.view.animation.AnimationUtils
1010
import android.widget.ImageView
1111
import android.widget.TextView
12+
import androidx.core.app.SharedElementCallback
1213
import androidx.fragment.app.Fragment
1314
import androidx.transition.Slide
1415
import androidx.transition.Transition
@@ -74,6 +75,9 @@ class Fragment2_4MagazineDetail : Fragment() {
7475
// This is shared transition for imageView and title
7576
val moveTransition =
7677
TransitionInflater.from(context).inflateTransition(android.R.transition.move)
78+
.apply {
79+
duration = 500
80+
}
7781

7882
sharedElementEnterTransition = moveTransition
7983

@@ -106,6 +110,55 @@ class Fragment2_4MagazineDetail : Fragment() {
106110
// circularReveal.start()
107111
// }
108112
// })
113+
114+
setEnterSharedElementCallback(object : SharedElementCallback() {
115+
116+
var startTime = 0L
117+
118+
override fun onMapSharedElements(
119+
names: MutableList<String>?,
120+
sharedElements: MutableMap<String, View>?
121+
) {
122+
super.onMapSharedElements(names, sharedElements)
123+
println("🔥 DetailFragment setEnterSharedElementCallback() onMapSharedElements() names: $names, sharedElements: $sharedElements")
124+
}
125+
126+
override fun onRejectSharedElements(rejectedSharedElements: MutableList<View>?) {
127+
super.onRejectSharedElements(rejectedSharedElements)
128+
println("👻 DetailFragment setEnterSharedElementCallback() onRejectSharedElements() $rejectedSharedElements")
129+
}
130+
131+
override fun onSharedElementStart(
132+
sharedElementNames: MutableList<String>?,
133+
sharedElements: MutableList<View>?,
134+
sharedElementSnapshots: MutableList<View>?
135+
) {
136+
super.onSharedElementStart(
137+
sharedElementNames,
138+
sharedElements,
139+
sharedElementSnapshots
140+
)
141+
142+
println("🚙 DetailFragment setEnterSharedElementCallback() onSharedElementStart sharedElementNames: $sharedElementNames")
143+
startTime = System.currentTimeMillis()
144+
}
145+
146+
override fun onSharedElementEnd(
147+
sharedElementNames: MutableList<String>?,
148+
sharedElements: MutableList<View>?,
149+
sharedElementSnapshots: MutableList<View>?
150+
) {
151+
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots)
152+
153+
println(
154+
"🚙 DetailFragment onSharedElementStart " +
155+
"sharedElementNames: $sharedElementNames, " +
156+
"duration: ${System.currentTimeMillis() - startTime}"
157+
)
158+
159+
}
160+
161+
})
109162
}
110163

111164
private fun createEnterTransition(view: View): Transition {
@@ -184,7 +237,7 @@ class Fragment2_4MagazineDetail : Fragment() {
184237
val ivMagazineCover = view.findViewById<ImageView>(R.id.ivMagazineCover)
185238
val tvMagazineTitle = view.findViewById<TextView>(R.id.tvMagazineTitle)
186239

187-
ivMagazineCover.transitionName = "${magazineModel.drawableRes}"
240+
ivMagazineCover.transitionName = magazineModel.transitionName
188241
ivMagazineCover.setImageResource(magazineModel.drawableRes)
189242
tvMagazineTitle.text = magazineModel.title
190243
tvMagazineTitle.transitionName = magazineModel.title

0 commit comments

Comments
 (0)