Material Design - Activity transitions

在 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();

代码示例:

@Override
protected 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);
}

@Override
public 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的时候先进行检查系统版本。

你可能感兴趣的:(Material Design - Activity transitions)