因为要新增一个页面,突然想试试转场动画,做完以后还是做个笔记,防止以后忘记了不好找…
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之间的转场动画(共享元素)
/p/e9f63ead8bf5
借鉴的是这个.
举个简单粗暴的栗子:
共享元素之间同时添加约定好的
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());}}