开启动画的几个方法
- 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
)); //
B
Fragment
中的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