Activity transition(Activity转场动画效果)

来源:互联网 发布:moneywiz2 mac 编辑:程序博客网 时间:2024/05/17 07:57

参考:

Android5.0之Activity的转场动画

Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat

系统内置常见转场动画:

//              必须在 StartActivity() 或 finish() 之后立即调用                               Intent intent = new Intent(MainActivity.this, MainActivityI.class);                startActivity(intent);                overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);                overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Android5.0转场动画

1、ActivityOptionsCompat.makeCustomAnimation(context, enterResId, exitResId)

简单做一个定制的动画,这个参数很简单,传入一个进入的动画的id,和移除动画的id即可

类似于:overridePendingTransition。

//类似于:overridePendingTransition(R.anim.slide_bottom_in, R.anim.slide_bottom_out);//还不如直接用这个全版本的overridePendingTransitionActivityOptionsCompat options = ActivityOptionsCompat.makeCustomAnimation(MainActivity.this,                        R.anim.slide_bottom_in, R.anim.slide_bottom_out);Intent intent = new Intent(MainActivity.this, MainActivityI.class);startActivity(intent, options.toBundle());

2、ActivityOptionsCompat.makeScaleUpAnimation(source, startX, startY, startWidth, startHeight)

这个在4.x上有用,可以实现新的Activity从某个固定的坐标以某个大小扩大至全屏。

对于相册是很好的展示效果。

//让新的Activity从一个小的范围(比如第一个activity的一个按钮)扩大到全屏ActivityOptionsCompat options = ActivityOptionsCompat.makeScaleUpAnimation(btn2,                        btn2.getWidth() / 2, btn2.getHeight() / 2, //拉伸开始的坐标                        0, 0);//拉伸开始的区域大小,这里用(0,0)表示从无到全屏Intent intent = new Intent(MainActivity.this, MainActivityI.class);startActivity(intent, options.toBundle());

3、ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElement, sharedElementName)

当你需要当前界面中的某个元素和新界面中的元素有关时,你可以使用这个动画:

1、无共享元素:

启动activity:

                ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this);                Intent intent = new Intent(MainActivity.this, MainActivityI.class);                startActivity(intent, optionsCompat.toBundle());

第二个activity:

public class MainActivityI extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        //设置允许使用转场动画        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_maini);//        滑动进入        Slide slide = new Slide();        slide.setDuration(2000);        getWindow().setExitTransition(slide);//出去1动画        getWindow().setEnterTransition(slide);//进来的动画//        分解//        Explode explode = new Explode();//        explode.setDuration(2000);//        getWindow().setExitTransition(explode);//出去的动画//        getWindow().setEnterTransition(explode);//进来的动画//        淡入淡出//        Fade fade = new Fade();//        fade.setDuration(2000);//        getWindow().setExitTransition(fade);//出去的动画//        getWindow().setEnterTransition(fade);//进来的动画    }}

2、有一个共享元素:

①布局中共享的元素添加 android:transitionName=”mybtn1”:

  <Button            android:id="@+id/btn2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:text="跳转activity动画"            android:transitionName="mybtn1" />

②activity中

                Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, btn2, "mybtn1").toBundle();                Intent intent = new Intent(MainActivity.this, MainActivityI.class);                startActivity(intent, bundle);

参数btn2:表示第一个和第二个activity中的共享元素(就是那个Button),
参数”mybtn1”:表示布局文件中transitionAnimation属性的值。

第二个activity中

①布局中共享的元素添加 android:transitionName:

注意:transitionName名称要对应且相同。

    <Button        android:id="@+id/btn1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:text="第二个界面的第一个按钮"        android:transitionName="mybtn1" />

②activity中不做任何操作

3、有多个共享元素:

如果两个页面中有多个共享元素该怎么办呢?
android:transitionName属性还像上面一样设置,然后在启动Activity时我们可以通过Pair.create方法来设置多个共享元素。

启动activity:

①布局中共享的元素添加 android:transitionName属性,名称自定义:

        <Button            android:id="@+id/btn2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:text="跳转activity动画"            android:transitionName="mybtn1" />        <Button            android:id="@+id/btn3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:text="第一个界面的第二个按钮"            android:transitionName="mybtn2" />

②activity中

Bundle bundle = ActivityOptions    .makeSceneTransitionAnimation(MainActivity.this,      Pair.create(((View) btn2), "mybtn1"),      Pair.create(((View) btn3), "mybtn2"))    .toBundle();Intent intent = new Intent(MainActivity.this, MainActivityI.class);startActivity(intent, bundle);

Pair.create方法中有两个参数,
第一个是共享元素的实例(注意要是View类型),
第二个参数是该View的transitionAnimation属性的值。

第二个activity中

①布局中共享的元素添加 android:transitionName:

注意:transitionName名称要对应且相同。

    <Button        android:id="@+id/btn1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:text="第二个界面的第一个按钮"        android:transitionName="mybtn1" />    <Button        android:id="@+id/btn2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:text="第二个界面的第二个按钮"        android:transitionName="mybtn2" />

②activity中不做任何操作

原创粉丝点击