27
2017
09

Activity transition(Activity转场动画效果)

参考:

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);
//还不如直接用这个全版本的overridePendingTransition
ActivityOptionsCompat 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中不做任何操作

上一篇:ActivitiesManager工具类 下一篇:Android开发艺术探索_Android的Drawable(六)