群英传之Android 5.X过渡动画
来源:互联网 发布:sublime java高亮显示 编辑:程序博客网 时间:2024/05/07 14:19
Android 2.0之后可以通过overridePendingTransition()给Activity增加切换动画.而在Android5.X中,Google对动画效果进行了更深一步的诠释,为Activity的跳转设计了更加丰富的动画效果。
以下是效果图:
建议拖到 “效果图的具体实现代码”,将代码运行一遍,再重新看原理,速度就会快很多。
Android 5.X提供了三种Transition类型
- 进入:一个进入过渡动画决定Activity中的所有视图怎么进入屏幕
- 退出:一个退出的渡动画决定Activity中的所有视图怎么退出屏幕
- 共享元素:一个共享元素过渡动画决定两个Activity之间的过渡,怎么共享它们的视图
其中,进入效果和退出效果包括:
- explode(分解) ——从屏幕中间进或出,移动视图
- slide(滑动) ——从屏幕边缘进或出,移动视图
- fade(淡出) ——通过改变屏幕上视图的不透明度达到添加或移除视图
共享元素包括:
- changeBounds ——改变目标视图的布局边界
- changeClipBounds——裁剪目标视图边界
- changeTransform——改变目标视图的缩放比例和旋转角度
- changeImageTransform——改变目标图片的大小和缩放比例
以上元素属性配置时,系统会自动设置..
具体操作
首先先看进入与退出三种过渡动画##
例如从MainActivity跳转到Main2ActivityB,只需要在MainActivity中将基本的startActivity(intent)方法改成如下代码:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
而在Main2Activity中,只需要设置如下所示代码:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);//这句要写在setContentView()前,具体原因到时再补充
或
<!-- 允许使用transitions,放在主题Style里 --> <item name="android:windowContentTransitions">true</item>
接下来就可以设置进入动画,在Main2Activity设置,代码如下:
//同样,都是要写在setContentView()前面 getWindow().setEnterTransition(new Explode()); getWindow().setEnterTransition(new Slide()); getWindow().setEnterTransition(new Fade());
退出动画设置为,代码如下:
//同样,都是要写在setContentView()前面 getWindow().setExitTransition(new Explode()); getWindow().setExitTransition(new Slide()); getWindow().setExitTransition(new Fade());
共享元素效果
第一章图片中的Android机器人就是共享元素,即Activity1与Activity2都拥有的元素,在Activity1跳转到Activity2的时候,其他元素消失,而共享元素——Android机器人通过动画效果直接显示到Activity2中。
所以,要想在程序中使用共享元素的动画效果,需要再Activity1的布局文件中设置共享元素,即给对应控件增加相关属性,代码如下:
android:transitionName="XXX"<!--该值任意-->
同时在Activity2的布局文件中,给要实现共享效果的元素也增加相同的属性,代码如下:
android:transitionName="XXX"<!--该值应与其相同,系统才能找到共享元素-->
如果只有一个共享元素,Activity1中只需要使用如下代码:
//view为共享元素,share为指定transitionName="XXX"对应的XXX startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, view,"share")).toBundle());
如果有多个共享属性,可以通过Pair.create()来创建多个共享元素,代码如下:
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view,"share"),Pair.create(fab,"fab")).toBundle());
到这里所有的步骤就完成。
效果图的具体实现代码
“跳转按钮”是Android2.0使用overridePendingTransition()的实现,所以以下代码不会给出..
MainActivity代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //如果报错就在每个方法前加上@TargetApi(Build.VERSION_CODES.LOLLIPOP),主要是为了防止版本太低 public void explode(View v) { Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("flag", 0); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } public void slide(View v) { Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("flag", 1); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } public void fade(View view) { Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("flag", 2); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } public void share(View view) { Toast.makeText(MainActivity.this, "aaaaa", Toast.LENGTH_SHORT).show(); View fab = findViewById(R.id.fab_button); Intent intent = new Intent(this, Main2Activity.class); intent.putExtra("flag", 3); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create(view,"share"),Pair.create(fab,"fab")).toBundle()); }}
MainActivity的Xml代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".activitys.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="explode" android:onClick="explode"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="slide" android:onClick="slide"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="fade" android:onClick="fade"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="share" android:transitionName="share"<!--设置共享元素属性share--> android:onClick="share"/> <Button android:id="@+id/fab_button" android:layout_width="80dp" android:layout_height="80dp" android:background="@drawable/aaa" android:transitionName="fab"<!--设置共享元素属性fab--> android:elevation="5dp" /></LinearLayout>
但其实在MainActivity的xml中,transitionName其实不设置代码也是没问题的,有兴趣可以去试试。因为在MainActivity的代码的ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create(view,”share”),Pair.create(fab,”fab”)).toBundle())中,view与fab 其实就是那两个Button。
Main2Activity代码:
public class Main2Activity extends AppCompatActivity { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); int flag = getIntent().getExtras().getInt("flag"); switch (flag){ case 0://explode getWindow().setEnterTransition(new Explode()); getWindow().setExitTransition(new Explode()); break; case 1://slide getWindow().setEnterTransition(new Slide()); getWindow().setExitTransition(new Slide()); break; case 2://fade getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade()); break; case 3://不用任何操作 break; } setContentView(R.layout.activity_main2); }}
Main2Activity的Xml代码:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".activitys.Main2Activity"> <View android:id="@+id/holder_view" android:layout_width="match_parent" android:layout_height="300dp" android:transitionName="share"<!--android:transitionName属性share--> android:background="#4cA3D2"/> <Button android:transitionName="fab"<!--transitionName属性fab--> android:layout_width="56dp" android:layout_height="56dp" android:background="@drawable/aaa" android:elevation="5dp" android:layout_below="@+id/holder_view" android:layout_marginTop="-26dp" android:layout_alignParentEnd="true" android:layout_marginRight="20dp" android:layout_alignParentRight="true" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/holder_view"> <Button android:layout_width="match_parent" android:layout_height="60dp" android:layout_marginTop="10dp" android:id="@+id/button4" /> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="60dp" android:background="#4cA3D2" android:layout_below="@+id/button4" /> </RelativeLayout></RelativeLayout>
如果对Android 2.0之后可以通过overridePendingTransition()给Activity增加切换动画有兴趣,可以参照:
http://blog.csdn.net/abrazen_zz/article/details/52548618
- 群英传之Android 5.X过渡动画
- Android学习之5.X过渡动画的实现
- Android 5.x的Activity过渡动画.
- android 5.x—过渡动画Transition
- Android之过渡动画
- Android之过渡动画
- android过渡动画之makeSceneTransitionAnimation
- android5.x之Activity过渡动画
- Android 5.X SVG矢量动画机制——Android群英传
- 动画机制-《Android群英传》
- Android 5.0学习之Activity过渡动画
- Android 5.0学习之Activity过渡动画
- Android过渡动画之进入退出
- android过渡动画之makeSceneTransitionAnimation学习笔记
- Android群英传之Android动画机制与使用技巧
- Android群英传之Android动画机制与使用技巧
- Android 5.X 新特性详解(三)——Activity过渡动画
- Android 5.X Activity过渡动画,以及漂亮的共享元素效果
- 文章标题
- hdu 5900 QSC and Master 区间dp
- [Leetcode] Contains Duplicate II
- 伪静态,防盗链,网址错误
- JAVA EE-SERVLET
- 群英传之Android 5.X过渡动画
- 养老评估--老年人能力评估信息平台和数据库--9.18
- 测量目标对象行走的速度---WiFi Signals
- 使用FFmpeg库实现视频解码
- Ubuntu 14.04更新软件提示W: GPG error: http://archive.ubuntukylin.com:10006 xenial InRelease
- Android中UI控件的详细介绍(六)——ImageView
- Serivce通知Activity更新UI方法总结
- HibernateSessionFactory
- CI多表联查