【Animations】使用动画开始Activity(12)

概要


材料设计应用程序中的活动转换通过公共元素之间的运动和转换提供不同状态之间的视觉连接。您可以为进入和退出转换以及活动之间共享元素的转换指定自定义动画。

  • 一进入过渡确定意见的活动如何进入现场。例如,在爆炸输入转换中,视图从外部进入场景并飞向屏幕中心。
  • 一个出口转型决定在活动退出现场如何看法。例如,在爆炸退出过渡中,视图从中心离开场景。
  • 一个共享元素的过渡确定在这些活动之间的两个活动转变之间共享如何视图。例如,如果两个活动在不同的位置和大小上具有相同的图像,那么changeImageTransform共享元素转换将平滑地在这些活动之间平移和缩放图像。

https://developer.android.com/design/material/videos/ContactsAnim.mp4
图1。与共享元素的转换。
Android支持这些进入和退出转换:

  • 爆炸 - 将视图移入或移出场景中心。
  • 幻灯片 - 将视图移入或移出场景的一个边缘。
  • 淡入淡出 - 通过更改其不透明度来添加或删除场景中的视图。

Visibility作为进入或退出转换支持任何扩展类的转换。有关更多信息,请参阅Transition该类的API参考 。

Android也支持这些共享元素转换:

  • changeBounds - 动画更改目标视图的布局边界。
  • changeClipBounds - 动画处理目标视图的剪辑边界中的更改。
  • changeTransform - 动画改变目标视图的缩放和旋转。
  • changeImageTransform - 动画改变目标图像的大小和比例。

当您在应用中启用活动转换时,会在进入和退出活动之间激活默认的交叉淡化转换。
【Animations】使用动画开始Activity(12)

图2 - 一个共享元素的场景转换。
有关使用共享元素在活动之间进行动画处理的示例代码,请参阅 ActivitySceneTransitionBasic

检查系统版本


活动转换API可在Android 5.0(API 21)及更高版本上使用。为了保持与早期版本的Android的兼容性,请在version调用以下任何功能的API之前在运行时检查系统:

// Check if we're running on Android 5.0 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Apply activity transition
} else {
    // Swap without transition
}

指定自定义转换


首先,android:windowActivityTransitions 在定义从材质主题继承的样式时,使用该属性启用窗口内容转换。您还可以在样式定义中指定输入,退出和共享元素转换:

<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowActivityTransitions">true</item>

  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/explode</item>
  <item name="android:windowExitTransition">@transition/explode</item>

  <!-- specify shared element transitions -->
  <item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
  <item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>
</style>

change_image_transform本例中的转换定义如下:

<!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
  <changeImageTransform/>
</transitionSet>

该changeImageTransform元素对应于 ChangeImageTransform该类。有关更多信息,请参阅API参考Transition。

要在代码中启用窗口内容转换,请调用 Window.requestFeature()方法:

// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

// set an exit transition
getWindow().setExitTransition(new Explode());

要在代码中指定转换,请使用Transition对象调用这些方法:

  • Window.setEnterTransition()
  • Window.setExitTransition()
  • Window.setSharedElementEnterTransition()
  • Window.setSharedElementExitTransition()

该setExitTransition()和setSharedElementExitTransition()方法定义为调用活动退出缓和。该setEnterTransition()和setSharedElementEnterTransition()方法定义为所谓的活动进入过渡。

要获得转换的全部效果,您必须在调用和被调用的活动上启用窗口内容转换。否则,调用活动将启动退出转换,但您会看到一个窗口转换(如缩放或淡入淡出)。

要尽快开始输入转换,请使用Window.setAllowEnterTransitionOverlap() 被调用活动的 方法。这可以让你有更戏剧性的输入转换。

使用转换开始一个活动


如果启用转场并为活动设置退出转换,则在启动其他活动时会激活转换,如下所示:

startActivity(intent,
              ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

如果您为第二个活动设置了输入转换,则在活动启动时也会激活转换。要在启动其他活动时禁用转场,请提供null选项包。

用共享元素开始一项活动


在具有共享元素的两个活动之间制作屏幕过渡动画:

  • 在主题中启用窗口内容切换。
  • 以您的风格指定共享元素转换。
  • 将转换定义为XML资源。
  • 使用android:transitionName属性为两个布局中的共享元素分配一个公共名称 。
  • 使用该ActivityOptions.makeSceneTransitionAnimation()方法。
// get the element that receives the click event
final View imgContainerView = findViewById(R.id.img_container);

// get the common element for the transition in this activity
final View androidRobotView = findViewById(R.id.image_small);

// define a click listener
imgContainerView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, Activity2.class);
        // create the transition animation - the images in the layouts
        // of both activities are defined with android:transitionName="robot"
        ActivityOptions options = ActivityOptions
            .makeSceneTransitionAnimation(this, androidRobotView, "robot");
        // start the new activity
        startActivity(intent, options.toBundle());
    }
});

对于您在代码中生成的共享动态视图,请使用该 View.setTransitionName()方法在两个活动中指定一个公共元素名称。

要在完成第二个活动时反转场景过渡动画,请调用 Activity.finishAfterTransition() 方法而不是Activity.finish()。

用多个共享元素开始一项活动


要在具有多个共享元素的两个活动之间制作场景过渡动画,请使用该android:transitionName 属性(或者View.setTransitionName()在两个活动中使用该方法)在两个布局中定义共享元素,然后ActivityOptions按如下方式创建一个对象:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
        Pair.create(view1, "agreedName1"),
        Pair.create(view2, "agreedName2"));
Lastest Update:2018.05.24

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Animations】使用动画开始Activity(12)

猜你喜欢

转载自blog.51cto.com/4789781/2120993
今日推荐