引子

相信开发过iOS的程序员都知道iOS ViewController之间的跳转动画非常多,很酷对不对?这让开发Android的羡慕不已,曾几何时,Android中的Activity跳转是何等的生硬,But,在Android 5.0以后,Google也为Activity的转场设计了更加友好的动画效果。

转场动画(Activity Transition)基本介绍

Android 5.0 提供了三种Transition类型
进入:决定Activity中的所有的视图怎么进入屏幕。
退出:决定一个Activity中的所有视图怎么退出屏幕。
共享元素:决定两个activities之间的过渡,怎么共享(它们)的视图。

进入和退出包含如下动画效果
  • explode(分解) – 从屏幕中间进或出
  • slide(滑动) - 从屏幕边缘进或出地
  • fade(淡出) –通过改变屏幕上视图的不透明度达到添加或者移除视图的效果
共享元素包含如下动画效果
  • changeBounds - 改变目标视图的布局边界
  • changeClipBounds - 裁剪目标视图边界
  • changeTransform - 改变目标视图的缩放比例和旋转角度
  • changeImageTransform - 改变目标图片的大小和缩放比例
实践

1.准备好2个Activity的布局,弄几个按钮,分别对应几种转场动画。

activity_one.xml ActivityOne的布局,其中最后一个Button是为了做共享元素动画

    

activity_two.xml ActivityTwo的布局,里面的Button与第一个布局中的最后一个Button呼应,只是大小不一样

    

2.ActivityOne 与 ActivityTwo

ActivityOne.java

public class ActivityOne extends Activity {    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_one);        intent = new Intent(ActivityOne.this, ActivityTwo.class);    }    public void explode(View view) {        intent.putExtra("transition", "explode");        //将原先的跳转改成如下方式        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ActivityOne.this).toBundle());    }    public void slide(View view) {        intent.putExtra("transition", "slide");        //将原先的跳转改成如下方式        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ActivityOne.this).toBundle());    }    public void fade(View view) {        intent.putExtra("transition", "fade");        //将原先的跳转改成如下方式        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ActivityOne.this).toBundle());    }    public void share(View view) {        //共享元素        Button share = (Button) findViewById(R.id.share);        intent.putExtra("transition", "share");        //将原先的跳转改成如下方式,注意这里面的第三个参数决定了ActivityTwo 布局中的android:transitionName的值,它们要保持一致        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ActivityOne.this, share, "shareTransition").toBundle());    }}

ActivityTwo.java

public class ActivityTwo extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 允许使用transitions        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);        String transition = getIntent().getStringExtra("transition");        switch (transition) {            case "explode":                // 设置进入时进入动画                Explode explode = new Explode();                explode.setDuration(1000);                getWindow().setEnterTransition(explode);                break;            case "slide":                Slide slide = new Slide();                slide.setDuration(1000);                getWindow().setEnterTransition(slide);                break;            case "fade":                Fade fade = new Fade();                fade.setDuration(1000);                getWindow().setEnterTransition(fade);                break;            case "share":                break;        }        // 所有操作在设置内容视图之前        setContentView(R.layout.activity_two);    }}

说明:
getWindow().setEnterTransition()是进入动画,与之对应的getWindow().setExitTransition()就是退出转场动画,用法和上面一样,就不重复了

3.测试效果
explode

explode.gif
slide

slide.gif

fade

fade.gif
share

share.gif
问题

explode效果感觉并没有从中间进,而是从上面下来的,这是为什么呢?欢迎知道的告知,感谢。

更多相关文章

  1. Android(安卓)TextView实现点击展开动画效果
  2. Lottie Android(安卓)初探
  3. 【Android(安卓)Studio】制作启动画面Splash Screen
  4. Android自定义Dialog、Dialog样式、Dialog动画
  5. Android属性动画详解(二),插值器和估值器
  6. android学习——activity实现动画切换
  7. Android(安卓)25种开源炫酷UI动画框架
  8. Android中弹簧动画的那些事 - SpringAnimation
  9. 自定义MediaPlayer控制组件

随机推荐

  1. Android studio finished with non-zero
  2. Edittext输入框限制字母数字
  3. Android开发之Java集合类性能分析
  4. Android下多页显示技巧
  5. android用sharepreference保存输入框中的
  6. Android一键锁屏开发全过程【源码】【附
  7. android backgroud alpha
  8. 2010.12.26——— android 获得手机号码
  9. Android加速度传感器数值的过滤
  10. Android 之 setTextColor 写法