Android Transition

本文介绍了Android中使用TransitionManager、beginDelayedTransition等方法实现视图动画过渡的技术细节,包括代码示例和XML配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值