因为要新增一个页面,突然想试试转场动画,做完以后还是做个笔记,防止以后忘记了不好找…
1. Activity与Activity的转场动画
5.0以上才行,但是如果手机没有5.0则会执行默认普通情况
1.1普通的3种Activity过渡动画
有3种效果,分别是:
- explode(分解) – 从屏幕中间进来或出去,移动视图
- slide(滑动) – 从屏幕边缘进来或出去,移动视图
- fade(淡出) – 改变屏幕视图的不透明度来添加或移除视图
举个栗子:
ActivityA跳转到ActivityB
ActivityA的跳转方法
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
ActivityB的设置
在ActivityB的onCreate()生命周期的setContentView()之前设置:
getWindow().requestFeature(Window.FRATURE_CONTENT_TRANSITIONS);
或
在style文件内添加属性
<item name="android:windowContentTransitions">true</item>
同时根据需要的的过渡动画进行设置
(设置在getWindow().requestFeature()方法之后,setContentView()方法之前)
getWindow().setEnterTransition(new Explode());
getWindow().setEnterTransition(new Slide());
getWindow().setEnterTransition(new Fade());
1.2 共享元素的Activity的转场动画
这种才叫高端,这种看起来才cooooool..
共享元素包括:
- changeBounds: 改变视图的位置和大小
- changeClipBounds:裁剪目标视图边界
- changeTransform: 改变目标视图的缩放和旋转
- changeImageTransform: 改变图片的大小和缩放
还是举个栗子:
比如说2个Activity共享一个Button.
那么需要在2个Activity的Button上面同时添加
android:transitionName = "xxx";
切记2个Activity的Button的这个属性的值得一致.
最后在ActivityA跳转到ActivityB时:
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(
this,
共享的组件,
"约定好的那个属性名").toBundle());
如果需要共享多个元素,那么就是用Pair.create()来创建多个元素
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(
this,
Pair.create(共享组件1,"约定好的属性名1"),
Pair.create(共享组件2,"约定好的属性名2"))
.toBundle());
2.Fragment与Fragment之间的转场动画(共享元素)
举个简单粗暴的栗子:
共享元素之间同时添加约定好的
android:transitionName = "xxx";
创建好需要跳转的Fragment ==> XXFragment
XXFragment fragment =new XXFragment();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
detailFragment.setSharedElementEnterTransition(new DetailTransition());
setExitTransition(new Fade());
fragment.setEnterTransition(new Fade());
fragment.setSharedElementReturnTransition(new DetailTransition());
}
getActivity().getSupportFragmentManager().beginTransaction()
.addSharedElement(共享组件,"约定好的属性名")
.replace(Activity的容器id, fragment)
.addToBackStack(null)
.commit();
}
自定义动画:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class DetailTransition extends TransitionSet {
public DetailTransition() {
init();
}
// 允许资源文件使用
public DetailTransition(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setOrdering(ORDERING_TOGETHER);
addTransition(new ChangeBounds()).
addTransition(new ChangeTransform()).
addTransition(new ChangeImageTransform());
}
}