今天在写一个闪屏页的时候碰到一个问题,当闪屏页为全屏,下一个 Activity 不是全屏的时候,添加 Activity 切换动画,顶部的任务栏总是会在动画结束的时候突然弹出来,造成莫名的卡顿感,在一篇博客里找到了比较好的解决方法,在此记录一下。
先来看一下需要用到的动画资源
闪屏页退出动画
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:zAdjustment="top">
<scale
android:duration="@android:integer/config_mediumAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="0"
android:toYScale="0" />
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1"
android:toAlpha="0" />
</set>
闪屏页后下一个要显示的 Activity 进入动画
<set xmlns:Android="http://schemas.android.com/apk/res/android"
Android:interpolator="@android:anim/decelerate_interpolator">
<scale
Android:duration="@android:integer/config_mediumAnimTime"
Android:fromXScale="2.0"
Android:fromYScale="2.0"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toXScale="1.0"
Android:toYScale="1.0" />
</set>
下面是 SplashActivity.class 的代码
package com.wechat.sunny.leancloudsty.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;
import com.avos.avoscloud.AVUser;
import com.wechat.sunny.leancloudsty.R;
/**
* Created by Sunny on 2017/5/10.
* Email:670453367@qq.com
* Description: 闪屏页 Activity
*/
public class SplashActivity extends AppCompatActivity {
private final static int USER_LOGINED = 0x01; // 用户已登录
private final static int USER_NOT_LOGINED = 0x02; // 用户未登录
public Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case USER_LOGINED:
Intent intentMain = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intentMain);
overridePendingTransition(R.anim.zoomin, R.anim.zoomout); // 启用 Activity 切换动画
finish();
break;
case USER_NOT_LOGINED:
Intent intentLogin = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(intentLogin);
overridePendingTransition(R.anim.zoomin, R.anim.zoomout); // 启用 Activity 切换动画
finish();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 全屏
*/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
/**
* 判断用户是否已经登录
*/
AVUser currentUser = AVUser.getCurrentUser();
if (currentUser != null) {
mHandler.sendEmptyMessageDelayed(USER_LOGINED, 2000);
} else {
mHandler.sendEmptyMessageDelayed(USER_NOT_LOGINED, 2000);
}
}
}
可以看到我们的 Splash 页面是设置了全屏的,上面的代码我们不做任何处理,切换 Activity 执行动画的时候,切换到的第二个 Activity 开始也是全屏的,直到动画结束,顶部的任务栏突然跳出来,给人一种卡顿感。解决方法很简单,在 Activity 切换之前,把 Splash 页面的全屏通过以下代码取消掉即可。
/**
* 退出全屏模式,解决从全屏到不是全屏的 Activity 的动画卡顿问题
*/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
这样第二个 Activity 的任务栏开始就是显示的,并且也是通过动画显示出来的。
方法参考自:http://www.jianshu.com/p/63bba2e09b78