Material-Animations(二)--Shared elements between Activities
来源:互联网 发布:iphone相片导入mac 编辑:程序博客网 时间:2024/04/27 13:46
原文:https://github.com/lgvalle/Material-Animations
Activity间共享元素
Activity间共享元素的本质是有两个不同的View
在不同的布局(Activity
),然后通过某种方式把它们连起来,然后做动画。
Transition framework
将会执行从一个View
到另外一个View
的过渡动画。
有一点需要注意的是:view
不是从一个Activity
转移到另外一个Activity
中,他们是完全独立的两个View
a)允许Window Content Transition
如果想实现Activity
间共享元素,那么需要在app
的styles.xml
文件中配置。
values/styles.xml
<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"> ... <item name="android:windowContentTransitions">true</item ...</style>
同时在这里可以为整个app
配置缺省的enter
,exit
和shared element transitions
<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"> ... <!-- specify enter and exit transitions --> <item name="android:windowEnterTransition">@transition/explode</item> <item name="android:windowExitTransition">@transition/explode</item> <!-- specify shared element transitions --> <item name="android:windowSharedElementEnterTransition">@transition/changebounds</item> <item name="android:windowSharedElementExitTransition">@transition/changebounds</item> ...</style>
b)定义一个相同的过渡名字(transition name
)
实现Activity
间共享元素,需要给源View
和目标View
设置相同的 android:transitionName
,他们的其他的属性可以不同,但唯独android:transitionName
必须相同。
layout/activity_a.xml
<ImageView android:id="@+id/small_blue_icon" style="@style/MaterialAnimations.Icon.Small" android:src="@drawable/circle" android:transitionName="@string/blue_name" />
layout/activity_b.xml
<ImageView android:id="@+id/big_blue_icon" style="@style/MaterialAnimations.Icon.Big" android:src="@drawable/circle" android:transitionName="@string/blue_name" />
c) 使用共享元素启动Activity
使用ActivityOptions.makeSceneTransitionAnimation()
方法定义共享元素源View
和过渡的名字transitionName
MainActivity.java
blueIconImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, SharedElementActivity.class); View sharedView = blueIconImageView; String transitionName = getString(R.string.blue_name); ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, sharedView, transitionName); startActivity(i, transitionActivityOptions.toBundle()); }});
经过三面几步,漂亮的过渡动画就完成了。
如上面所示,Transition framework
创建并执行动画,而这些动画使我们感到错觉,认为这个View
是从一个Activity
一边改变形状一边移动到另外一个Activity
。
Fragment间共享元素
Fragment
间共享元素和Activity
间共享元素非常相像,步骤a)和步骤b)一样,只是步骤c)改变。
a)允许Window Content Transition
values/styles.xml
<style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"> ... <item name="android:windowContentTransitions">true</item> ...</style>
b)定义一个相同的过渡名字(transition name
)
layout/fragment_a.xml
<ImageView android:id="@+id/small_blue_icon" style="@style/MaterialAnimations.Icon.Small" android:src="@drawable/circle" android:transitionName="@string/blue_name" />
layout/fragment_b.xml
<ImageView android:id="@+id/big_blue_icon" style="@style/MaterialAnimations.Icon.Big" android:src="@drawable/circle" android:transitionName="@string/blue_name" />
c) 使用共享元素启动Fragment
FragmentB fragmentB = FragmentB.newInstance(sample);// Defines enter transition for all fragment viewsSlide slideTransition = new Slide(Gravity.RIGHT);slideTransition.setDuration(1000);sharedElementFragment2.setEnterTransition(slideTransition);// Defines enter transition only for shared elementChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);fragmentB.setSharedElementEnterTransition(changeBoundsTransition);getFragmentManager().beginTransaction() .replace(R.id.content, fragmentB) .addSharedElement(blueView, getString(R.string.blue_name)) .commit();
最终的结果
允许重叠过渡
你可以定义进入(enter transitions
)和退出(exit transition
)的过渡动画是否互相重叠。
根据Android
官方文档
如果设置为
Ture
,enter transition
将会立即执行
如果设置为False
,enter transition
将等到exit transition
完全执行完毕才开始执行
上面的设置对于Fragment
和Activity
一样有效
FragmentB fragmentB = FragmentB.newInstance(sample);// Defines enter transition for all fragment viewsSlide slideTransition = new Slide(Gravity.RIGHT);slideTransition.setDuration(1000);sharedElementFragment2.setEnterTransition(slideTransition);// Defines enter transition only for shared elementChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);fragmentB.setSharedElementEnterTransition(changeBoundsTransition);// Prevent transitions for overlappingfragmentB.setAllowEnterTransitionOverlap(overlap);fragmentB.setAllowReturnTransitionOverlap(overlap);getFragmentManager().beginTransaction() .replace(R.id.content, fragmentB) .addSharedElement(blueView, getString(R.string.blue_name)) .commit();
我们能很容易的发现两者的不同
Fragment_2
出现在Fragment_1
顶部 直到Fragment_1
消失,Fragment_2
才出现 - Material-Animations(二)--Shared elements between Activities
- Material-Animations(一)--Transitions between Activities
- Material-Animations(四)--(Bonus) Shared elements + Circular Reveal
- Material-Animations(三)--Animate view layout elements
- passing data between Activities
- Material-Animations讲解笔记
- Material-Animations-master解析
- Passing Objects Between Android Activities
- Material Design - Activity Transition Animations
- Material-Animations-master源码解析
- Material-Animations-master学习笔记
- Maximum Difference Between Two Elements
- Animations使用(二)
- Animations的使用(二)
- android Animations 动画效果(二)
- Activities
- Activities
- Activities
- 我为什么鼓励工程师写blog
- 非洲小孩
- 【最小割Dinic】BZOJ1163(Baltic2008)[Mafia]题解
- linux下nginx安装
- Stack 堆栈的实现
- Material-Animations(二)--Shared elements between Activities
- Rest API
- activiti 中 setVariable与setVariableLocal区别
- MyEclipse 2015 stable 3.0 详解安装图解与注册方法
- android 界面布局技巧记录
- JSON那些事
- Uva-624 CD (需要输出方案的01背包)
- TCP协议
- java在调用System.out.println()打印一个新new的对象时,为什么会调用toString方法?