Android Transition

开启动画的几个方法
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值