标签:
定义 Activity A,Activity B。
Activity.overridePendingTransition 是在 A 启动 B 时定义这个过程中用什么动画的。
常见三种动画形式: 1) A slide up B still, 2) A disapper B slide up, 3) A and B both slide up。
1) A slide up B still
核心代码:
slide_up_z.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:zAdjustment="top"> <translate android:duration="1000" android:fillAfter="true" android:fromYDelta="0" android:toYDelta="-100%" > </translate> </set>
SecondActivity.java
public static void launchWithFirstSlideUpAnim(Activity activity) { Intent i = new Intent(activity,SecondActivity.class); activity.startActivity(i);activity.overridePendingTransition(0, R.anim.slide_out_z); }
关键点:slide_up_z.xml中定义 android:zAdjustment="top" ,将 A 的视图定义在最上层方有效果。
2) A disapper B slide up
核心代码:
slide_in_z.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fillAfter="true" android:fromYDelta="30%p" android:toYDelta="0" > </translate> </set>
SecondActivity.java
public static void launchWithSecondSlideUpAnim(Activity activity) { Intent i = new Intent(activity,SecondActivity.class); activity.startActivity(i); activity.overridePendingTransition(R.anim.slide_in_z,0); }
关键点:开发时注意到比较多的热门app会在Welcome转主页的时候用到这个动画,可能一般Welcome页面会设计成全屏,
而主页一般不是全屏,采用这种让welcome消失而主页执行动画的方式能比较好的承接这种转换。另外这个动画时间最好设置成
300ms,因为有些比较高版本手机在启动B的时候状态栏往下走的动画也是300ms,类似一个咬合动画。
3) A and B both slide up
核心代码:
slide_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fillAfter="true" android:fromYDelta="100%" android:toYDelta="0" > </translate> </set>
slide_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fillAfter="true" android:fromYDelta="0" android:toYDelta="-100%" > </translate> </set>
SecondActivity.java
public static void launchWithBothSlideUp(Activity activity) { Intent i = new Intent(activity,SecondActivity.class); activity.startActivity(i); activity.overridePendingTransition(R.anim.slide_in,R.anim.slide_out); }
关键点:让两个动画的时间相同。
遇到的问题:
1)动画不执行:先查看手机设置,显示->动画 打上勾。
2)A 启动 B后不执行动画:在A中为了模拟延迟操作,如下
private void delay() { new Timer().schedule(new TimerTask() { public void run() { SecondActivity.launchWithFirstSlideUpAnim(this); } }, 1000); }
后来发现在非UI线程启动Activity是不会执行动画的,于是改为
private void delay() { new Timer().schedule(new TimerTask() { public void run() { Message msg = Message.obtain(); msg.what = TIME_OUT; mHandler.sendMessage(msg); } }, 1000); }
在Handler中处理,结果好了。
private static class MyHandler extends Handler { WeakReference<FirstActivity> weakRef = null; MyHandler(WeakReference<FirstActivity> ref) { this.weakRef = ref; } @Override public void handleMessage(Message msg) { switch (msg.what) { case TIME_OUT: if (weakRef != null) { FirstActivity activity = weakRef.get(); if (activity != null) {
activity.enterSecondActivity(); } } break; default:break; } } }//end of handler
源码(eclipse):http://files.cnblogs.com/files/big-w/StartActivityWithAnimation.zip
Activity.overridePendingTransition三种动画形式调试记录
标签:
原文地址:http://www.cnblogs.com/big-w/p/4331375.html