Android动画:Transition

本文介绍Android中如何使用Scene和TransitionManager实现视图之间的切换动画,包括创建Scene、执行过渡动画的方法及自定义TransitionManager的过程。

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

scene:场景,transition:转换。

BasicTransition

getSceneForLayout()+TransitionManager.go(scene3)+new Scene()需要API>=19

demo中共有3个scene,分别是scene1、scene2、scene3,对应的xml分别是scene1.xml、scene2.xml、scene3.xml,scene本身的根布局的id都是一样的,这里是container;

效果图

这里写图片描述

scene_root:

存放scene的布局

<LinearLayout>
	....
    <FrameLayout
        android:id="@+id/scene_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include layout="@layout/scene0"/>
    </FrameLayout>
</LinearLayout>

scene1.xml

scene本身的根布局的id都是一样的,这里是container;

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:id="@+id/view1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:background="@color/colorAccent"/>

    <View
        android:id="@+id/view2"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:background="@color/colorPrimary"/>

    <View
        android:id="@+id/view3"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerHorizontal="true"
        android:background="@color/color1"/>

</RelativeLayout>

创建scene的2种方法

第一种:试了下new Scene()无效果

Scene scene1 = new Scene(scene_root, container)
scene_root:存放scene的布局
container:scene本身的根布局

第二种:

Scene scene1 = Scene.getSceneForLayout(scene_root, R.layout.scene1, context);
第一个参数:存放scene的布局
第二个参数:scene
第三个参数:context

变换scene

//第一种:
TransitionManager.go(scene1);
//第2种:
TransitionManager transitionManager = new TransitionManager();
transitionManager.transitionTo(scene3)

步骤

  1. 创建scene
  2. 转换scene

对应的方法分别是:

Scene scene1 = Scene.getSceneForLayout(scene_root, R.layout.scene1, context);
TransitionManager.go(scene1);

自定义TransitionManager

TransitionInflater transitionInflater = TransitionInflater.from(context);
TransitionManager transitionManager = transitionInflater.inflateTransitionManager(R.transition.custom_transition_manager, scene_root);

custom_transition_manager.xml是放在res/transition文件夹中

<?xml version="1.0" encoding="utf-8"?>
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android">
    <transition android:toScene="@layout/scene3"
                android:transition="@transition/changebounds_fadein_transition"/>
</transitionManager>

其中changebounds_fadein_transition.xml也是放在value/transition文件夹中

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds/>
    <fade android:fadingMode="fade_in_out" android:duration="500">
        <targets>
            <target android:targetId="@id/tv"/>
        </targets>
    </fade>
</transitionSet>

没有scene怎么实现动画效果

代码

transitionManager.beginDelayedTransition(scene_root);

View view2 = findViewById(R.id.view2);
ViewGroup.LayoutParams params = view2.getLayoutParams();
int dimension = (int) getResources().getDimension(R.dimen.dimen50);
params.width = dimension;
params.height = dimension;
view2.requestLayout();

效果图

这里写图片描述

其它

参考:https://github.com/googlesamples/android-BasicTransition
demo:http://git.oschina.net/AnimationDemo/basictransition01

转换动画

Android Developer Guild :
https://developer.android.google.cn/training/material/animations.html#Reveal

(还没太搞明白)
需要在API>=21,首先,在定义您从材料主题继承的风格时,使用 android:windowContentTransitions 属性启用窗口内容转换。您也可在您的风格定义中指定进入、退出以及共享元素转换:

<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowContentTransitions">true</item>

  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/explode</item>
  <item name="android:windowExitTransition">@transition/explode</item>

  <!-- specify shared element transitions -->
  <item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
  <item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>
</style>
<!--API>=21-->
<item name="android:windowContentTransitions">true</item>
<item name="android:windowTransitionBackgroundFadeDuration">5000</item>
<item name="android:windowEnterTransition">@android:transition/slide_right</item>
<item name="android:windowExitTransition">@android:transition/slide_right</item>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值