android动画之TransitionManager

本文详细介绍了Android中TransitionManager的使用方法,包括如何实现不同场景间的过渡效果,如Fade、Slide等,并提供了具体的代码示例。

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

TransitionManager用于Scene场景之间的过渡

Scene储存着一个根View下的各个View的属性,例如下图就是一个场景

场景过渡有两个触发方式 

go()beginDelayedTransition()

常见的过渡效果有

Fade Slide Explode ChangeBounds


go()

使用该方法是进行两个布局之间的切换,提前设置好两个布局,然后进行切换。

如下图是主视图,在Framelayout中插入要进行切换的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.m.oftransitionmanager.MainActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/root">
        <include layout="@layout/demo1"/>
    </FrameLayout>
</LinearLayout>


下面是两个切换的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:id="@+id/root">
        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:id="@+id/root">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@mipmap/ic_launcher" />
</RelativeLayout>

然后就要写代码了

  Scene scene1;
    Scene scene2;
    boolean demo1=true;
    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.btn);
        ViewGroup group=findViewById(R.id.root);
        scene1=Scene.getSceneForLayout(group,R.layout.demo1,this);
        scene2=Scene.getSceneForLayout(group,R.layout.demo2,this);
        button.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onClick(View v) {
                TransitionManager.go(demo1?scene2:scene1,new ChangeBounds());
                demo1=!demo1;
            }
        });

    }
首先需要通过
Scene.getSceneForLayout(group,R.layout.demo1,this);

获得场景,第一个参数ViewGroup是布局的根View

然后通过

 TransitionManager.go();

进行场景切换

效果图:


该方法第一个参数是要跳转至的场景

第二个参数是切换效果,也可以通过xml文件进行设置

  Transition set= TransitionInflater.from(v.getContext()).inflateTransition(R.transition.demo_transition);
  TransitionManager.go(demo1?scene2:scene1,set);
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">

<slide
    android:slideEdge="top"
    android:duration="2000"
    android:interpolator="@android:interpolator/fast_out_slow_in"
    tools:targetApi="lollipop" />

</transitionSet>


  beginDelayedTransition()

通过go()切换场景需要创建布局,不免还是有些繁琐,所以还有一个更简单的方法beginDelayedTransition()

该方法可以在原布局不变的情况下,通过修改View的属性来进行场景过渡

public class DelayedActivity extends AppCompatActivity {
    ImageView imageView;
    boolean inite=true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_delayed);
        imageView=findViewById(R.id.delayed_img);
        ViewGroup.LayoutParams params= imageView.getLayoutParams();
        params.height=100;
        params.width=100;
        imageView.setLayoutParams(params);
        imageView.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onClick(View v) {
                ViewGroup viewGroup=(ViewGroup) findViewById(android.R.id.content);
                TransitionManager.beginDelayedTransition(viewGroup,new ChangeBounds());
                ViewGroup.LayoutParams params= imageView.getLayoutParams();
                if (inite){
                    params.height=400;
                    params.width=400;
                }else {
                    params.height=100;
                    params.width=100;
                }
                inite=!inite;
                imageView.setLayoutParams(params);
            }
        });
    }
}


值得注意的是,我们可以通过

findViewById(android.R.id.content)
获取一个activity的根View,具体参考

https://stackoverflow.com/questions/4486034/get-root-view-from-current-activity



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值