【问题标题】:How to use the MaterialSharedAxis Transition in Java如何在 Java 中使用 MaterialSharedAxis 过渡
【发布时间】:2020-03-19 18:35:26
【问题描述】:

如何获得 here 中提到的 MaterialSharedAxis 过渡 在 Java 中。您可以看到文档在 Kotlin 中,我找不到这些转换的 Java 文档。我通过 Android Studio 查看了这个库,我也可以找到这样的一个类。请帮忙

【问题讨论】:

    标签: java android material-design transition


    【解决方案1】:

    活动之间的转换

    要使用MaterialSharedAxis,您需要使用低于 1.2.0 版本的材料库。 在您的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>
    

    活动 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);
    }
    

    活动 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);
    }
    

    触发动画:

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

    【讨论】:

      【解决方案2】:

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

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

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


      片段之间的过渡

      为了实现Fragment之间的Transition,需要在两个Fragment的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 的官方语言,并且大多数库、文档 sn-ps 和示例应用程序现在都使用它编写。

      【讨论】:

      • 如何使用活动来做到这一点?因为window.setExitTransition() 期待android.transition.Transition 而MaterialSharedAxis 继承androidx.transition.Transition
      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 2021-05-28
      • 2022-01-27
      • 1970-01-01
      • 2021-06-20
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多