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的时候先进行检查系统版本。
- Material Design - Activity transitions
- Material Design - Activity Transition Animations
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- Material Design
- material design
- Material design
- Material Design
- Material Design
- Material Design
- MSTest.exe 命令行选项
- PL/SQL开发环境准备
- Linux动态库的编译与使用
- android常识
- JFace开发详解
- Material Design - Activity transitions
- Plugin(插件)和Goals(目标)
- ATL 支持ActiveX控件开发的所实现的接口
- 当你还不能写出自己满意的程序时,你就不要去睡觉。
- (5)python循环语句
- hibernate jpa 注解 @Temporal(TemporalType.DATE)
- 进程与线程的区别(转)
- Laravel框架的体系结构
- Gethibernatetemplate的查询更新以及批量操作方法