Skip to content

Commit f9bb153

Browse files
Merge pull request #90 from MihaiCristianCondrea/codex/fix-nav-host-transition-animation
Adjust nav transitions based on direction
2 parents 1eb4be1 + 0b462bf commit f9bb153

File tree

6 files changed

+40
-13
lines changed

6 files changed

+40
-13
lines changed

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.os.Build;
77
import android.os.Bundle;
88
import android.util.Log;
9+
import android.util.SparseIntArray;
910
import android.view.View;
1011

1112
import androidx.activity.OnBackPressedCallback;
@@ -74,6 +75,8 @@ public class MainActivity extends AppCompatActivity {
7475
private StartupViewModel startupViewModel;
7576
private ConsentInformation consentInformation;
7677
private NavController navController;
78+
private final SparseIntArray navOrder = new SparseIntArray();
79+
private int currentNavIndex;
7780
private AppUpdateNotificationsManager appUpdateNotificationsManager;
7881
private AppUpdateManager appUpdateManager;
7982
private InstallStateUpdatedListener installStateUpdatedListener;
@@ -227,23 +230,47 @@ private void observeViewModel() {
227230
navGraph.setStartDestination(uiState.getDefaultNavDestination());
228231
navController.setGraph(navGraph);
229232

230-
NavOptions springNavOptions = new NavOptions.Builder()
233+
navOrder.put(R.id.navigation_home, 0);
234+
navOrder.put(R.id.navigation_android_studio, 1);
235+
navOrder.put(R.id.navigation_about, 2);
236+
currentNavIndex = navOrder.get(navController.getCurrentDestination().getId());
237+
238+
NavOptions forwardOptions = new NavOptions.Builder()
231239
.setEnterAnim(R.anim.fragment_spring_enter)
232240
.setExitAnim(R.anim.fragment_spring_exit)
233241
.setPopEnterAnim(R.anim.fragment_spring_pop_enter)
234242
.setPopExitAnim(R.anim.fragment_spring_pop_exit)
235243
.build();
236244

245+
NavOptions backwardOptions = new NavOptions.Builder()
246+
.setEnterAnim(R.anim.fragment_spring_pop_enter)
247+
.setExitAnim(R.anim.fragment_spring_pop_exit)
248+
.setPopEnterAnim(R.anim.fragment_spring_enter)
249+
.setPopExitAnim(R.anim.fragment_spring_exit)
250+
.build();
251+
237252
if (useRail) {
238253
NavigationUI.setupWithNavController(mBinding.navRail, navController);
239254
mBinding.navRail.setOnItemSelectedListener(item -> {
240-
navController.navigate(item.getItemId(), null, springNavOptions);
255+
if (item.getItemId() == navController.getCurrentDestination().getId()) {
256+
return true;
257+
}
258+
int newIndex = navOrder.get(item.getItemId());
259+
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
260+
navController.navigate(item.getItemId(), null, options);
261+
currentNavIndex = newIndex;
241262
return true;
242263
});
243264
} else {
244265
NavigationUI.setupWithNavController(navBarView, navController);
245266
navBarView.setOnItemSelectedListener(item -> {
246-
navController.navigate(item.getItemId(), null, springNavOptions);
267+
if (item.getItemId() == navController.getCurrentDestination().getId()) {
268+
return true;
269+
}
270+
int newIndex = navOrder.get(item.getItemId());
271+
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
272+
navController.navigate(item.getItemId(), null, options);
273+
currentNavIndex = newIndex;
247274
return true;
248275
});
249276
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<translate
44
android:fromXDelta="100%"
55
android:toXDelta="0%"
6-
android:duration="300"
6+
android:duration="250"
77
android:interpolator="@interpolator/fragment_spring" />
88
<alpha
99
android:fromAlpha="0"
1010
android:toAlpha="1"
11-
android:duration="300"
11+
android:duration="250"
1212
android:interpolator="@interpolator/fragment_spring" />
1313
</set>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<translate
44
android:fromXDelta="0%"
55
android:toXDelta="-100%"
6-
android:duration="300"
6+
android:duration="250"
77
android:interpolator="@interpolator/fragment_spring" />
88
<alpha
99
android:fromAlpha="1"
1010
android:toAlpha="0"
11-
android:duration="300"
11+
android:duration="250"
1212
android:interpolator="@interpolator/fragment_spring" />
1313
</set>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<translate
44
android:fromXDelta="-100%"
55
android:toXDelta="0%"
6-
android:duration="300"
6+
android:duration="250"
77
android:interpolator="@interpolator/fragment_spring" />
88
<alpha
99
android:fromAlpha="0"
1010
android:toAlpha="1"
11-
android:duration="300"
11+
android:duration="250"
1212
android:interpolator="@interpolator/fragment_spring" />
1313
</set>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<translate
44
android:fromXDelta="0%"
55
android:toXDelta="100%"
6-
android:duration="300"
6+
android:duration="250"
77
android:interpolator="@interpolator/fragment_spring" />
88
<alpha
99
android:fromAlpha="1"
1010
android:toAlpha="0"
11-
android:duration="300"
11+
android:duration="250"
1212
android:interpolator="@interpolator/fragment_spring" />
1313
</set>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
33
<changeBounds
4-
android:duration="300"
4+
android:duration="250"
55
android:interpolator="@interpolator/fragment_spring" />
66
<fade
7-
android:duration="300"
7+
android:duration="250"
88
android:interpolator="@interpolator/fragment_spring" />
99
</transitionSet>

0 commit comments

Comments
 (0)