【发布时间】:2020-03-19 18:35:26
【问题描述】:
如何获得 here 中提到的 MaterialSharedAxis 过渡 在 Java 中。您可以看到文档在 Kotlin 中,我找不到这些转换的 Java 文档。我通过 Android Studio 查看了这个库,我也可以找到这样的一个类。请帮忙
【问题讨论】:
标签: java android material-design transition
如何获得 here 中提到的 MaterialSharedAxis 过渡 在 Java 中。您可以看到文档在 Kotlin 中,我找不到这些转换的 Java 文档。我通过 Android Studio 查看了这个库,我也可以找到这样的一个类。请帮忙
【问题讨论】:
标签: java android material-design transition
要使用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());
【讨论】:
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。