Android Api Demos登顶之路(三十六)Fragment-->Custom Animation
来源:互联网 发布:联通网络信号怎么样 编辑:程序博客网 时间:2024/05/01 15:53
这个demo演示了如何利用setcustomAnimation实现Fragment的切换动画
* 实现自定义动画的类是ObjectAnimator,不仅用于fragment,也可用于view。
* 注意定义动画一定要replace方法之前执行.
* 动画资源文件需要放在res\animator\目录下,且根标签是set, objectAnimator, or valueAnimator三者之一。
activity_main.xml
<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:orientation="vertical" > <FrameLayout android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" android:layout_marginBottom="5dp"> <Button android:id="@+id/push" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Push"/> <Button android:id="@+id/pop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pop"/> </LinearLayout></LinearLayout>
res目录下新建animator目录,定义动画效果
push_enter.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:valueFrom="300" android:valueTo="0" android:duration="3000" android:propertyName="X"> </objectAnimator> <objectAnimator android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:valueFrom="0.0" android:valueTo="1.0" android:valueType="floatType" android:duration="3000" android:propertyName="alpha"> </objectAnimator></set>
push_exit.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:duration="3000" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="X" android:valueFrom="0" android:valueTo="300" > </objectAnimator> <objectAnimator android:duration="3000" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="alpha" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" > </objectAnimator></set>
pop_enter.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:valueFrom="-300" android:valueTo="0" android:duration="3000" android:propertyName="X"> </objectAnimator> <objectAnimator android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:valueFrom="0.0" android:valueTo="1.0" android:valueType="floatType" android:duration="3000" android:propertyName="alpha"> </objectAnimator></set>
pop_exit.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:duration="3000" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="X" android:valueFrom="0" android:valueTo="-300" > </objectAnimator> <objectAnimator android:duration="3000" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="alpha" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" > </objectAnimator></set>
MainActivity
public class MainActivity extends Activity { private int mStackLevel = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button push=(Button) findViewById(R.id.push); Button pop=(Button) findViewById(R.id.pop); push.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addFragmentToStack(); } }); pop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); if(savedInstanceState==null){ FragmentTransaction ft=getFragmentManager().beginTransaction(); CountingFragment cf=CountingFragment.getInstance(mStackLevel); ft.add(R.id.frameLayout, cf,"currentfragment"); ft.commit(); }else{ mStackLevel=savedInstanceState.getInt("stacklevel", 1); } } @Override public void onBackPressed() { super.onBackPressed(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("stacklevel", mStackLevel); } protected void addFragmentToStack() { mStackLevel++; CountingFragment newFragment = CountingFragment .getInstance(mStackLevel); // 开启push事务则向activity中添加新的fragment FragmentTransaction ft = getFragmentManager().beginTransaction(); // 设置自定义动画,前两个参数表示Fragment被推进任务栈时的动画效果 // 被两个参数表示Fragment被从任务栈推出时的动画效果 ft.setCustomAnimations(R.animator.push_enter, R.animator.push_exit, R.animator.pop_enter, R.animator.pop_exit); ft.replace(R.id.frameLayout, newFragment, "currentfragment"); /* * 将事务添加到后台堆栈,当事务被提交后将执行事务,当从按返回键从堆栈中推出时则事务执行相反 的操作 */ ft.addToBackStack(null); ft.commit(); } public static class CountingFragment extends Fragment { private int mNum; public static CountingFragment getInstance(int num) { CountingFragment cf = new CountingFragment(); Bundle args = new Bundle(); args.putInt("level", num); cf.setArguments(args); return cf; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 将传递进来的数据取出 Bundle args = getArguments(); mNum = args != null ? args.getInt("level") : 1; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 使用取出的数据 View v = inflater.inflate(R.layout.hello, container, false); TextView tv = (TextView) v.findViewById(R.id.text); tv.setText("Fragment #:" + mNum); tv.setBackground(getResources().getDrawable( android.R.drawable.gallery_thumb)); return v; } }}
0 0
- Android Api Demos登顶之路(三十六)Fragment-->Custom Animation
- Android Api Demos登顶之路(三十六)Fragment-->ContextMenu
- Android Api Demos登顶之路(四十六)Loader-->Custom
- Android Api Demos登顶之路(104)View-->Custom
- Android Api Demos登顶之路(十九)Rotation Animation
- Android Api Demos登顶之路(三十五)Fragment-->Argument
- Android Api Demos登顶之路(三十七)Fragment-->Dialog
- Android Api Demos登顶之路(四十)Fragment-->Layout
- Android Api Demos登顶之路(四十一)Fragment-->Menu
- Android Api Demos登顶之路(107)View-->ExpanableLists-->Custom Adapter
- Android Api Demos登顶之路(六十六)Graphics-->Animation Drawable
- Android Api Demos登顶之路(九十八)Text-->Animation->3D Transition
- Android Api Demos登顶之路(九十九)Text-->Animation->Push
- Android Api Demos登顶之路(三十五)Fragment-->Alert Dialog
- Android Api Demos登顶之路(三十八)Fragment-->Dialog or Activity
- Android Api Demos登顶之路(三十九)Fragment-->show hide
- Android Api Demos登顶之路(四十二)Fragment-->Nesting Tabs
- Android Api Demos登顶之路(四十三)Fragment-->Retain Instance
- 深度学习(deep learning)如果有春天,先得摆脱高能耗高资源依赖的局面
- Linux————TCP/IP协议
- 基于深度优先算法的有向图环路检测
- 消息MSG、 获取消息GetMessage、消息过滤、第一个鼠标、键盘消息等
- Android点击应用Icon发生了什么
- Android Api Demos登顶之路(三十六)Fragment-->Custom Animation
- Hibernate 下载、安装和使用
- HDU 5399(简单数学)
- ios开发数组排序(数组中包括字典)
- Windows线程池
- iOS 带cookie进行网络请求
- WPARAM和LPARAM一看就得知道是消息的附加参数
- 海量数据处理:十道面试题与十个海量数据处理方法总结
- java基础学习多线程学习笔记