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

来源:互联网 发布:女款棉衣淘宝网 编辑:程序博客网 时间:2024/05/17 20:58

今天在写一个闪屏页的时候碰到一个问题,当闪屏页为全屏,下一个 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

0 0