开启动画的几个方法
- TransitionManager.go()
- beginDelayedTransition()
- setEnterTransition()/setSharedElementEnterTransition()
Transition Framework 核心就是根据Scene(场景)的不同帮助开发者们自动生成动画
1.TransitionManager.go
TransitionManager.go()触发动画,由scene1场景转换到scene2场景,系统根据new ChangeBounds()生成动画
private void initScene() {
ViewGroup sceneRoot= (ViewGroup) findViewById(R.id.frame_layout);
scene1=Scene.getSceneForLayout(sceneRoot,R.layout.scene_1_changebounds,this);
scene2=Scene.getSceneForLayout(sceneRoot,R.layout.scene_2_changebounds,this);
TransitionManager.go(scene1);
}
public void change(View view){
TransitionManager.go(isScene2?scene1:scene2,new ChangeBounds());
//TransitionManager.go(Scene scene, Transition transition)
isScene2=!isScene2;
}
TransitionManager.go
其实是调用当前的scene(scene1)的scene1.exit()以及下一个scene(scene2)的scene2.enter()
Scene通常由getSceneForLayout (ViewGroup sceneRoot,int layoutId,Context context)获取实例。
- sceneRoot scene发生改变和动画执行的位置
- layoutId 即上文所说的根view
动画效果
ChangeBounds 检测view的位置边界创建移动和缩放动画
ChangeTransform 检测view的scale和rotation创建缩放和旋转动画
ChangeClipBounds检测view的剪切区域的位置边界,和ChangeBounds类似。不过ChangeBounds针对的是view而ChangeClipBounds针对 的是view的剪切区域(setClipBound(Rect rect) 中的rect)。如果没有设置则没有动画效果
ChangeImageTransform 检测ImageView(这里是专指ImageView)的尺寸,位置以及ScaleType,并创建相应动画。
Fade,Slide,Explode(非共享元素也可用)这三个都是根据view的visibility的不同分别创建渐入,滑动,爆炸动画。
AutoTransition 动画集合
代码创建
AutoTransition autoTransition=new AutoTransition();
autoTransition.addTransition(new Fade());
XML创建
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds/>
<explode/>
</transitionSet>
代码中调用
Transition sets=TransitionInflater.from(this).inflateTransition(R.transition.changebounds_and_fade);
2.beginDelayedTransition()
原理则是通过代码改变view的属性,然后通过之前介绍的ChangeBounds等类分析start scene和end Scene不同来创建动画
//默认调用了 AutoTransition(Fade和ChangeBounds)
TransitionManager.beginDelayedTransition(layout);
//AutoTransition源码部分
private void init() {
setOrdering(ORDERING_SEQUENTIAL);
addTransition(new Fade(Fade.OUT)).
addTransition(new ChangeBounds()).
addTransition(new Fade(Fade.IN));
}
3.界面切换动画
(1)setExitTransition() - 当A start B时,使A中的View退出场景的transition(默认为null)
(2)setEnterTransition() - 当A start B时,使B中的View进入场景的transition(默认为Fade)
(3)setReturnTransition() - 当B 返回 A时,使B中的View退出场景的transition(默认为EnterTransition)
(4)setReenterTransition() - 当B 返回 A时,使A中的View进入场景的transition(默认为ExitTransition)
在style中添加<item name="android:windowActivityTransitions">true</item>
Target节点通过Id指定需要实现动画的View
<transitionSet
android:duration="800" //设置动画集合运行时间,也可单独设置时间
xmlns:android="http://schemas.android.com/apk/res/android">
<slide android:slideEdge="top"> //设置方向
<targets >
<target android:targetId="@id/image_bg"></target>
<target android:targetId="@id/fab"></target>
</targets>
</slide>
<fade>
<targets >
<target android:targetId="@id/toolBar"></target>
//API>21 非ID 状态栏 导航栏等
<target android:targetId="@android:id/statusBarBackground"></target>
</targets>
</fade>
</transitionSet>
4.Fragment切换
BigIconFragment bigIconFragment=new BigIconFragment(); //将跳转的Fragment
bigIconFragment.setSharedElementEnterTransition(new ChangeBounds()); //设置共享元素变换方式
bigIconFragment.setEnterTransition(new Slide(Gravity.RIGHT)); //BFragment中的View进入场景的transition
getFragmentManager().beginTransaction()
.replace(R.id.container_fragment,bigIconFragment)
.addToBackStack(null)
.addSharedElement(shared_small_circle,"shared_circle_")
.commit();
注意:list页面跳转viewpager页面
A-->B
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(TestAnimationActivity.this, view, view.getTransitionName());
startActivityForResult(intent, REQUEST_CODE, options.toBundle());
源码部分:
public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
View sharedElement, String sharedElementName)
B页面
先行暂停等待TransitionName赋值完毕后再开启动画
postponeEnterTransition(); 暂停
view.setTransitionName 赋值
startPostponedEnterTransition();恢复动画
返回注意使用: finishAfterTransition();
B -->A
public void onActivityReenter(int resultCode, Intent data) {}
postponeEnterTransition(); 暂停
view.setTransitionName 赋值
startPostponedEnterTransition();恢复动画
参考链接:https://www.jianshu.com/p/e497123652b5