Skip to content

Commit 1938f51

Browse files
Refine top-level navigation motion
1 parent ac30a5f commit 1938f51

File tree

9 files changed

+52
-85
lines changed

9 files changed

+52
-85
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.d4rk.androidtutorials.java.ui.screens.main;
22

33
import android.Manifest;
4+
import android.animation.ValueAnimator;
45
import android.annotation.SuppressLint;
56
import android.app.Activity;
67
import android.content.Intent;
@@ -253,20 +254,6 @@ private void observeViewModel() {
253254
}
254255
}
255256

256-
NavOptions forwardOptions = new NavOptions.Builder()
257-
.setEnterAnim(R.anim.fragment_spring_enter)
258-
.setExitAnim(R.anim.fragment_spring_exit)
259-
.setPopEnterAnim(R.anim.fragment_spring_pop_enter)
260-
.setPopExitAnim(R.anim.fragment_spring_pop_exit)
261-
.build();
262-
263-
NavOptions backwardOptions = new NavOptions.Builder()
264-
.setEnterAnim(R.anim.fragment_spring_pop_enter)
265-
.setExitAnim(R.anim.fragment_spring_pop_exit)
266-
.setPopEnterAnim(R.anim.fragment_spring_enter)
267-
.setPopExitAnim(R.anim.fragment_spring_exit)
268-
.build();
269-
270257
androidx.navigation.NavDestination destination = navController.getCurrentDestination();
271258
if (destination != null) {
272259
currentNavIndex = navOrder.get(destination.getId(), currentNavIndex);
@@ -281,7 +268,7 @@ private void observeViewModel() {
281268
return true;
282269
}
283270
int newIndex = navOrder.get(item.getItemId());
284-
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
271+
NavOptions options = applyTopLevelNavAnimations(new NavOptions.Builder()).build();
285272
navController.navigate(item.getItemId(), null, options);
286273
currentNavIndex = newIndex;
287274
return true;
@@ -295,7 +282,7 @@ private void observeViewModel() {
295282
return true;
296283
}
297284
int newIndex = navOrder.get(item.getItemId());
298-
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
285+
NavOptions options = applyTopLevelNavAnimations(new NavOptions.Builder()).build();
299286
navController.navigate(item.getItemId(), null, options);
300287
currentNavIndex = newIndex;
301288
return true;
@@ -316,6 +303,21 @@ private void observeViewModel() {
316303
});
317304
}
318305

306+
private NavOptions.Builder applyTopLevelNavAnimations(NavOptions.Builder builder) {
307+
if (ValueAnimator.areAnimatorsEnabled()) {
308+
builder.setEnterAnim(R.anim.fragment_top_level_enter)
309+
.setExitAnim(R.anim.fragment_top_level_exit)
310+
.setPopEnterAnim(R.anim.fragment_top_level_enter)
311+
.setPopExitAnim(R.anim.fragment_top_level_exit);
312+
} else {
313+
builder.setEnterAnim(0)
314+
.setExitAnim(0)
315+
.setPopEnterAnim(0)
316+
.setPopExitAnim(0);
317+
}
318+
return builder;
319+
}
320+
319321

320322
private void navigateToPreferredDestination(int preferredDestination) {
321323
if (navController == null) {
@@ -328,10 +330,11 @@ private void navigateToPreferredDestination(int preferredDestination) {
328330
lastPreferredStartDestination = preferredDestination;
329331
return;
330332
}
331-
NavOptions options = new NavOptions.Builder()
332-
.setPopUpTo(graph.getStartDestinationId(), true)
333-
.setLaunchSingleTop(true)
334-
.build();
333+
NavOptions options = applyTopLevelNavAnimations(
334+
new NavOptions.Builder()
335+
.setPopUpTo(graph.getStartDestinationId(), true)
336+
.setLaunchSingleTop(true)
337+
).build();
335338
navController.navigate(preferredDestination, null, options);
336339
lastPreferredStartDestination = preferredDestination;
337340
}

app/src/main/res/anim/fragment_spring_enter.xml

Lines changed: 0 additions & 13 deletions
This file was deleted.

app/src/main/res/anim/fragment_spring_exit.xml

Lines changed: 0 additions & 13 deletions
This file was deleted.

app/src/main/res/anim/fragment_spring_interpolator.xml

Lines changed: 0 additions & 4 deletions
This file was deleted.

app/src/main/res/anim/fragment_spring_pop_enter.xml

Lines changed: 0 additions & 13 deletions
This file was deleted.

app/src/main/res/anim/fragment_spring_pop_exit.xml

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<set xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:shareInterpolator="false">
4+
<scale
5+
android:duration="300"
6+
android:startOffset="90"
7+
android:fromXScale="0.92"
8+
android:fromYScale="0.92"
9+
android:toXScale="1"
10+
android:toYScale="1"
11+
android:pivotX="50%"
12+
android:pivotY="50%"
13+
android:interpolator="@android:interpolator/fast_out_extra_slow_in" />
14+
<alpha
15+
android:duration="210"
16+
android:startOffset="90"
17+
android:fromAlpha="0"
18+
android:toAlpha="1"
19+
android:interpolator="@android:interpolator/linear_out_slow_in" />
20+
</set>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<set xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:shareInterpolator="false">
4+
<alpha
5+
android:duration="90"
6+
android:fromAlpha="1"
7+
android:toAlpha="0"
8+
android:interpolator="@android:interpolator/fast_out_linear_in" />
9+
</set>

app/src/main/res/transition/fragment_spring.xml

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)