码迷,mamicode.com
首页 > 其他好文 > 详细

Activity.overridePendingTransition三种动画形式调试记录

时间:2015-03-12 06:17:11      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

定义 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!