翻译一段android文档:
首先,在继承了material主题属性的style中添加
<item name="android:windowContentTransitions">true</item>
您还可以指定进入,退出动画, 并在你的style中定义共享单元转换, 类似这样:
<style name="BaseAppTheme" parent="android:Theme.Material">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">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>
同样的, 你也可以在代码中用 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());
要在代码中指定transitions, 需要使用以下方法, 并且传入一个 transitions 对象
- Window.setEnterTransition()
- Window.setExitTransition()
- Window.setSharedElementEnterTransition()
- Window.setSharedElementExitTransition()
setExitTransition() 和 setSharedElementExitTransition() 方法 定义了退出transition .
setEnterTransition() 和 setSharedElementEnterTransition() 方法定义了进入动画.
为了使这两种动画同时有效, 你需要为这两个Activity
的style
中同时声明:
<item name="android:windowContentTransitions">true</item>
为了更快的开始一个进入动画, 在被启动的Activity中使用 Window.setAllowEnterTransitionOverlap() 方法, 这可以让你有一个更鲜活的动画效果
Start an activity using transitions
如果你启用了 transitions 并且设置了退出动画, 则当启动Activity使用如下代码 :
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
如果你已经为第二个Activity定义了进入动画, 而 当 Activity 启动时, transition 也同样是有效的
如果想要 transitions 失效, 则启动Activity时, 传入一个为 null 的 options bundle即可.
Start an activity with a shared element
在两个Activity中使用元素共享的步骤:
在style中启用窗口内容过度(即:
<item name="android:windowContentTransitions">true</item>
)在style中指定一个共享元素transition
定义transition的xml资源文件
在共享元素的布局里面, 用
android:transitionName
属性指定一个同样的名字(名字一定要一样, 不能打错)调用
ActivityOptions.makeSceneTransitionAnimation()
方法.
// 接收OnClick事件的view
final View imgContainerView = findViewById(R.id.img_container);
// 这个Activity中的共享元素
final View androidRobotView = findViewById(R.id.image_small);
// 定义一个OnClick监听
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());
}
});
如果共享元素有多个则可以这样写:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "agreedName1"),
Pair.create(view2, "agreedName2"));
官方说发就是这样, 下面我们自己来实现下这个效果
demo地址
PS:我手机升级android5.0以后SRC屏幕录像用不成了, 好用的求录屏软件!! - - !