如何在 Java 中使用 MaterialSharedAxis Transition

How to use the MaterialSharedAxis Transition in Java

如何获得提到的 MaterialSharedAxis 转换 here 在 Java 中。您可以看到文档在 Kotlin 中 我找不到这些转换的 Java 文档。我通过 Android Studio 查看了图书馆,我也能找到这样的 class。请帮助

MaterialSharedAxis 是在 Material 库的 1.2.0-alpha05 版本中引入的,因此您需要在 build.gradle 文件中使用此版本(或更高版本):

implementation 'com.google.android.material:material:1.2.0-alpha05'

请注意,由于此库处于 alpha 阶段,因此在稳定版本发布之前可能会有一些重大更改。


片段之间的过渡

为了实现Fragments之间的Transition,需要在两个Fragments的onCreate方法中进行配置。

片段 A:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  MaterialSharedAxis backward = new MaterialSharedAxis(MaterialSharedAxis.Z, false);
  setReenterTransition(backward);

  MaterialSharedAxis forward = new MaterialSharedAxis(MaterialSharedAxis.Z, true);
  setExitTransition(forward);
}

片段 B:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  MaterialSharedAxis forward = new MaterialSharedAxis(MaterialSharedAxis.Z, true);
  setEnterTransition(forward);

  MaterialSharedAxis backward = new MaterialSharedAxis(MaterialSharedAxis.Z, false);
  setReturnTransition(backward);
}

要从片段 A 前进到片段 B:

getSupportFragmentManager()
  .beginTransaction()
  .replace(R.id.fragment_container, new FragmentB())
  .commit();

您应该考虑学习 Kotlin,因为它现在是 Android 的官方语言,并且大多数库、文档片段和示例应用程序现在都是用它编写的。

活动之间的转换

要使用 MaterialSharedAxis,您需要 1.2.0 版的 Material 库。 在您的 build.gradle 文件中:

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

在您的主题中启用 Activity 转换

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

Activity答:

@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乙:

@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);
}

触发动画:

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