Android 解决全屏闪屏页切换至非全屏Activity任务栏造成的卡顿

今天在写一个闪屏页的时候碰到一个问题,当闪屏页为全屏,下一个 Activity 不是全屏的时候,添加 Activity 切换动画,顶部的任务栏总是会在动画结束的时候突然弹出来,造成莫名的卡顿感,在一篇博客里找到了解决方法,在此记录一下。

先来看一下需要用到的动画资源

闪屏页退出动画
    "http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:zAdjustment="top">
        "@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" />
        "@android:integer/config_mediumAnimTime"
            android:fromAlpha="1"
            android:toAlpha="0" />
    </set>
闪屏页后下一个要显示的 Activity 进入动画
xmlns:Android="http://schemas.android.com/apk/res/android"
    Android:interpolator="@android:anim/decelerate_interpolator">
    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:[email protected]
 * 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

你可能感兴趣的:(android)