Material Design - Activity transitions

来源:互联网 发布:foxtable建立数据库 编辑:程序博客网 时间:2024/05/22 01:44

在 5.0 上 提供了很多动画效果方面的 优化 和 设置
在android5.0(api21)及以上,允许自定义这些动画:
1. Touch feedback 触摸反馈
2. Circular Reveal 圆形显示
3. Activity transitions 过渡动画
4. Curved motion 曲线运动
5. View state changes 视图状态变化

3. Activity transitions activity过渡动画
android L还增加了一些activity的过渡动画——爆炸、滑动、淡入淡出,让应用更加平滑。使用这些动画,你必须在进入和退出activity都要求使用这些内容转场特效

3.1要实现效果,可以设置三种 transitions

1. enter transition 进入动画
2. exit transition 退出动画
3. share transition 共享动画(在两个Activity间共享它们的activity transtion。比如,两个Activity有一个相同的图片,而位置和尺寸不同,使用changeImageTransform这个共享元素,能在Activity间平稳的转换和缩放图片。)

基本的效果有三种

android.transition.Explode //从场景的中心移入或移出android.transition.Slide //从场景的边缘移入或移出        android.transition.Fade  //调整透明度产生渐变效果

相应还有

android.transition.ChangeBounds;//View的布局的边界变化。android.transition.ChangeClipBounds;     //View的裁剪边界变化android.transition.ChangeImageTransform; //目标图像的尺寸和缩放变化android.transition.ChangeTransform;      //View的旋转、缩放边界变化

使用示例:
(1) 设置 xml

<style name="myTheme" parent="android:Theme.Material">          <!-- 允许使用transitions -->          <item name="android:windowContentTransitions">true</item>  <item name="android:windowAllowEnterTransitionOverlap">true</item><item name="android:windowAllowExitTransitionOverlap">true</item>        <!-- 指定进入和退出transitions -->  <item name="android:windowEnterTransition">@transition/explode</item>  <item name="android:windowExitTransition">@transition/explode</item>          <!-- 指定shared element transitions -->  <item name="android:windowSharedElementEnterTransition">              @transition/change_image_transform</item>  <item name="android:windowSharedElementExitTransition">              @transition/change_image_transform</item>  </style>  

如果不在xml中设置,在代码设置 transitions的方法

// 允许使用transitions  getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);  // 设置一个exit transition 动画getWindow().setExitTransition(new Explode());

(2) 定义transition动画:

使用方法和以前的AnimationSet差不多

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">      <explode/>      <changeBounds/>      <changeTransform/>      <changeClipBounds/>      <changeImageTransform/>  </transitionSet> 

代码示例:

<changeBounds  xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"    android:interpolator="@android:interpolator/bounce" />
// new Explode()对应系统默认提供的动画//android.transition.Explode//android.transition.Slide         //android.transition.Fade   //设置进入动画setEnterTransition()//设置退出效果setExitTransition()//设置共享元素的进入动画.setSharedElementEnterTransition()//设置共享元素的退出动画setSharedElementExitTransition()

(3)启动Activity
当你已经设置了允许使用Transition并设置了Transition动画,你就可以通过ActivityOptions.makeSceneTransitionAnimation()方法启动一个新的Activity来激活这个

startActivity(intent,              ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

当Activity中设置了enter transtion,在其启动时,它将被激活。想要disable transitions,那么在启动这个Activity前 bundle传为 null

startActivity(intent,null);

(4)共享元素跳转:
为了使有一个共享元素的两个activities间使用过渡动画:
1.在你的主题中启用窗口内容过渡(上面代码都有设置过)
2.在你的主题样式中指定共享元素的过渡(上面代码都有设置过)
3.定义你的过渡动画为XML资源
4.使用android:transitionName属性给两个布局中的共享元素指定一个相同的名字
5.使用ActivityOptions.makeSceneTransitionAnimation() 方法

跳转代码:

 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this,view,"shareName").toBundle());  //多个对象ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,          Pair.create(view1, "shareName1"),          Pair.create(view2, "shareName1")); 

共享元素,一定要2个界面都有该元素指定一个相同的名字

 <LinearLayout              android:orientation="horizontal"               android:elevation="2dip"              >      <TextView              android:elevation="8dip"              android:transitionName="shareName"              android:layout_width="50dp" />  </LinearLayout>

在代码中设置共享元素的名字:

 view.setTransitionName(transitionName);

当需要结束当前Activity并回退这个动画时调用Activity.finishAfterTransition()方法

Activity.finishAfterTransition();

代码示例:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);    getWindow().setEnterTransition( new Explode() );    getWindow().setExitTransition( new Explode() );    setContentView(R.layout.activity_explode_animation);}@Overridepublic void onBackPressed() {    super.onBackPressed();    finishAfterTransition();}

(4)-> 2总体共享元素动画示例(来自网络):
创建 transtition 文件

<changeBounds xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"    android:interpolator="@android:interpolator/bounce" />

xml 中设置 调用动画

2<item name="android:windowSharedElementEnterTransition">@transition/changebounds</item><item name="android:windowSharedElementExitTransition">@transition/changebounds</item>

跳转代码,开启下一个activity

Intent intent = new Intent( this,SharedElementSecondAnimationActivity.class ); //设置父类容器视图setTransitionGroup为false((ViewGroup)mImageView.getParent()).setTransitionGroup( false );ByteArrayOutputStream stream = new ByteArrayOutputStream();( (BitmapDrawable) mImageView.getDrawable() ).getBitmap().compress(Bitmap.CompressFormat.PNG, 100, stream);intent.putExtra( "image", stream.toByteArray() );ActivityOptions options;try {    options = ActivityOptions.makeSceneTransitionAnimation( this, mImageView, "image" );} catch( NullPointerException e ) {    Log.e( "SharedElementAnimationChangeBoundsActivity", "Did you set your ViewNames in the layout file?" );    return;}if( options == null ) {    Log.e("sharedelementanimation", "Options is null. Something broke. Good luck!");} else {    startActivity(intent, options.toBundle());}

3.2 监听可以在进入和退出动画生命周期中的特定点执行一些操作,给你更多让应用如何表现的控制权

getWindow().getEnterTransition().addListener( new Transition.TransitionListener {    @Override    public void onTransitionStart(Transition transition) {    }    @Override    public void onTransitionEnd(Transition transition) {    }    @Override    public void onTransitionCancel(Transition transition) {    }    @Override    public void onTransitionPause(Transition transition) {    }    @Override    public void onTransitionResume(Transition transition) {    }});

兼容性:

调用这些api的时候先进行检查系统版本。

1 0
原创粉丝点击