Search code examples
javaandroidmaterial-designtransition

How to use the MaterialSharedAxis Transition in Java


How do I get the MaterialSharedAxis transition as mentioned here in Java. You can see that the documentation is in Kotlin I couldn't find a Java documentation for these transitions. I took a look at the library via Android Studio and I could find such a class either. Please help


Solution

  • Transition between Activities

    To use MaterialSharedAxis you need at less version 1.2.0 of the Material library. In your build.gradle file:

    implementation 'com.google.android.material:material:1.2.1'
    

    Enable Activity transitions in your theme

    <style  name="MyTheme" parent="Theme.MaterialComponents.DayNight">
      ...
      <item  name="android:windowActivityTransitions">true</item>
    </style>
    

    Activity A:

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      // Slide left
      MaterialSharedAxis sharedAxisExit = new MaterialSharedAxis(MaterialSharedAxis.X,true);
      // Slide right
      MaterialSharedAxis sharedAxisEnter = new MaterialSharedAxis(MaterialSharedAxis.X,false);
    
      // Exclude this views from the animation, or you get a flicker in animation.
      sharedAxisEnter.excludeTarget(getWindow().getDecorView().findViewById(R.id.action_bar_container), true);
      sharedAxisEnter.excludeTarget(android.R.id.statusBarBackground, true);
            sharedAxisEnter.excludeTarget(android.R.id.navigationBarBackground, true);
    
              sharedAxisExit.excludeTarget(getWindow().getDecorView().findViewById(R.id.action_bar_container), true);
      sharedAxisExit.excludeTarget(android.R.id.statusBarBackground, true);
      sharedAxisExit.excludeTarget(android.R.id.navigationBarBackground, true);
    
      getWindow().setEnterTransition(sharedAxisEnter);
      getWindow().setExitTransition(sharedAxisExit);
    }
    

    Activity B:

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      
      MaterialSharedAxis sharedAxisEnter = new MaterialSharedAxis(MaterialSharedAxis.X,true);
      MaterialSharedAxis sharedAxisExit = new MaterialSharedAxis(MaterialSharedAxis.X,false);
    
              sharedAxisEnter.excludeTarget(getWindow().getDecorView().findViewById(R.id.action_bar_container), true);
      sharedAxisEnter.excludeTarget(android.R.id.statusBarBackground, true);
      sharedAxisEnter.excludeTarget(android.R.id.navigationBarBackground, true);
    
              sharedAxisExit.excludeTarget(getWindow().getDecorView().findViewById(R.id.action_bar_container), true);
      sharedAxisExit.excludeTarget(android.R.id.statusBarBackground, true);
      sharedAxisExit.excludeTarget(android.R.id.navigationBarBackground, true);
    
      getWindow().setEnterTransition(sharedAxisEnter);
      getWindow().setExitTransition(sharedAxisExit);
    }
    

    Trigger the animation:

    Intent intent = new Intent(ActivityA.this, ActivityB.class);
    ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(ActivityA.this);
    startActivity(intent, activityOptions.toBundle());