android手机全面屏适配

package jp.co.cybird.android.magicaldays;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.opd2c.magicaldays.bs.R;
import java.lang.reflect.Method;

public class GameActivityNew implements Application.ActivityLifecycleCallbacks {
    
    
    //游戏的根layout
    private ViewGroup mRootLayout;
    //游戏的根layout
    private Activity mMainActivity;
    //屏幕分辨率
    private int screenWidth;

    private int screenHeight;

    private float mDisplayScreenAspectRatio;

    private boolean mHasCheckAllScreen;

    private boolean mIsAllScreenDevice;

    //判断是否为游戏的主activity
    private Boolean IsMainActivity(final Activity activity) {
    
    
        String className = activity.getLocalClassName();

        if (className.endsWith("GameActivity")){
    
    
            mMainActivity = activity;
            return true;
        }
        return false;
    }

   //判断是否是全面屏
    private boolean IsFullScreenDevice(Activity context) {
    
    
        if (mHasCheckAllScreen) {
    
    
            return mIsAllScreenDevice;
        }
        mHasCheckAllScreen = true;

        mIsAllScreenDevice = false;
        // 低于 API 21的,都不会是全面屏。。。
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    
    
            return false;
        }
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        if (windowManager != null) {
    
    

            Display display = windowManager.getDefaultDisplay();

            Point point = new Point();

            display.getRealSize(point);

            float width, height;

            if (point.x < point.y) {
    
    

                width = point.x;

                height = point.y;
            }
            else{
    
    

                width = point.y;

                height = point.x;
            }
            if (height / width >= 1.97f) {
    
    

                mIsAllScreenDevice = true;
            }
        }
        Log.d("GameActivityNew","mIsAllScreenDevice:" + mIsAllScreenDevice);
        return mIsAllScreenDevice;
    }

    //隐藏下方手机的导航栏
    private void HideNavigationBar(Activity activity){
    
    

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
    

            WindowManager.LayoutParams params =activity.getWindow().getAttributes();

            params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;

            activity.getWindow().setAttributes(params);
        }
    }

    //允许应用显示全面屏
    private void AllowFullScreenDisplay(Activity activity){
    
    
        // 隐藏标题
        activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = activity.getWindow();
        // 如果需要设置全屏
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    
    
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
            Log.d("GameActivityNew","JELLY_BEAN");
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    
    
            WindowManager.LayoutParams lp = window.getAttributes();
            /**
             * 官方Android 9 支持最新的全面屏, https://developer.android.com/about/versions/pie/android-9.0
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT      仅仅当系统提供的bar完全包含了刘海区时,才允许window扩展到刘海区,否则window不会和刘海区重叠
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES  允许window扩展到刘海区
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER        不允许window扩展到刘海区
             */
            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            window.setAttributes(lp);
            Log.d("GameActivityNew","P");
        }
    }

    //获取是否存在NavigationBar--导航栏
    public boolean checkDeviceHasNavigationBar(Context context) {
    
    
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
    
    
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
    
    
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
    
    
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
    
    
                hasNavigationBar = true;
            }
        } catch (Exception e) {
    
    

        }
        return hasNavigationBar;
    }

    //获取NavigationBar高度
    public int getVirtualBarHeigh(Context context) {
    
    
        int vh = 0;
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        try {
    
    
            @SuppressWarnings("rawtypes")
            Class c = Class.forName("android.view.Display");
            @SuppressWarnings("unchecked")
            Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
            method.invoke(display, dm);
            vh = dm.heightPixels - windowManager.getDefaultDisplay().getHeight();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return vh;
    }

    //region    用于判断手机是否显示NavigationBar,只要主layout布局发生变化就会检测到
    private boolean mLayoutComplete;// 用于判断布局是否初始化完成
    private int mRootlayoutHeight =0;// 用于记录上一次屏幕的高度
    private float mMagicalDaysCanvasAspectRatio = (float)1280/(float)720;
    private int mAdaptationIconHeight = 250;
    private void onNavigationBarStatusChanged() {
    
    
        mRootLayout.post(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                // 布局完成
                mLayoutComplete =true;
            }
        });
        mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
    
            @Override
            public void onGlobalLayout() {
    
    
                if (!mLayoutComplete) {
    
    
                    return;
                }
                onNavigationBarStatusChanged(mRootLayout);
            }
        });
    }
    public void onNavigationBarStatusChanged(ViewGroup rootlayout) {
    
    
        int _rh = rootlayout.getHeight();// 当前屏幕高度
        if (mRootlayoutHeight ==0) {
    
    
            mRootlayoutHeight = _rh;// 记录首次变化的屏幕高度
            Log.d("GameActivityNew","mRootlayoutHeight first changed," + mRootlayoutHeight);
            //底部图片
            AddViewToMainLayout("base5",screenHeight - (int)mDisplayScreenAspectRatio, 0, mRootLayout, mMainActivity);
        }
        // 如果为true,则说明NavigationBar显示或者隐藏
        if (mRootlayoutHeight != _rh){
    
    
            mRootlayoutHeight = _rh;// 将当前高度重新赋值为最新临时变量
            Log.d("GameActivityNew","mRootlayoutHeight has changed," + mRootlayoutHeight);
            //先删除底部图片,再重新绘制底图片,因为这个时候NavigationBar显示导致适配高度变化
            RemoveBottomImgView();
            AddViewToMainLayout("base5",screenHeight - (int)mDisplayScreenAspectRatio, 0, mRootLayout, mMainActivity);
        }
    }
    //endregion

    //添加view到主layout中
    public void AddViewToMainLayout(String resName,int topMargins,int bottomMargins, ViewGroup mRootLayout, Activity activity){
    
    
        ImageView img = new ImageView(activity);
        //设置图片的长宽
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(screenWidth, 250);
        img.setLayoutParams(layoutParams);
        //设置图片的icon
        AssetManager assetManager=activity.getAssets();
        try {
    
    
            InputStream in=assetManager.open("AdaptationIcon/"+ resName +".png");
            Bitmap bmp=BitmapFactory.decodeStream(in);
            img.setImageBitmap(bmp);
        } catch (Exception e) {
    
    
            // TODO: handle exception
            Log.d("GameActivityNew","setImageBitmap Exception:"+e);
        }

        //创建MarginLayoutParams,参数就填imgView的LayoutParams就行(设置图片的偏移坐标)
        ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(img.getLayoutParams());
        /*
        * 给这个MarginLayoutParams添加偏移参数  四个参数(一般只需要顶部和左边就能确定View的位置,后两个参数添0即可):
        *       left:第一个参数,是View距离屏幕左边的距离
        *       top:第二个参数,是Veiw距离屏幕顶部的距离
        *       right:第三个参数,是View距离屏幕右边的距离
        *       bottom: 第三个参数,是View距离屏幕底部的距离
        * */
        margin.setMargins(0, topMargins, 0, 0);
        RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(margin);
        img.setLayoutParams(layoutParams3);
        mRootLayout.addView(img);
    }

    //删除主layout中的适配底部填充viewImage
    public void RemoveBottomImgView(){
    
    
        mRootLayout.removeViewAt(2);
        Log.d("GameActivityNew","RemoveBottomImgView");
    }

    @Override
    public void onActivityCreated(final Activity activity, Bundle bundle) {
    
    
        if (IsMainActivity(activity)) {
    
    
            //必须放在这个,保证在最前面的activity中就隐藏掉导航栏,否则在下面的主activity中获取导航栏高度会有问题
            HideNavigationBar(activity);
            //判断设备是否是全面屏设备
            if(IsFullScreenDevice(activity)){
    
    
                //获取手机屏幕宽高
                WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
                Point point = new Point();
                if (wm != null) {
    
    
                    wm.getDefaultDisplay().getRealSize(point);
                    screenWidth = point.x;
                    screenHeight = point.y;
                    Log.d("GameActivityNew", point.x + ":" + point.y);
                }
                //算出全面屏单边超出游戏画布的尺寸
                mDisplayScreenAspectRatio = (screenHeight - mMagicalDaysCanvasAspectRatio*screenWidth)/2;
                Log.d("GameActivityNew", "widthPixels=" + screenWidth);
                Log.d("GameActivityNew", "heightPixels=" + screenHeight);
                Log.d("GameActivityNew", "mDisplayScreenAspectRatio=" + mDisplayScreenAspectRatio);

                //获取游戏主activity的根layout对象,方便在游戏在屏幕上下方绘制图片,做全面屏适配
                mRootLayout = (ViewGroup)activity.getWindow().getDecorView();
                //允许应用全屏显示(不加此代码,应用不会全屏显示)
                AllowFullScreenDisplay(activity);
                //用于判断手机是否显示NavigationBar,只要主layout显示高度发生变化就能检测到
                onNavigationBarStatusChanged();
                //顶部图片
                AddViewToMainLayout("base4", (int)mDisplayScreenAspectRatio - mAdaptationIconHeight,0, mRootLayout, activity);
            }

            SdkJniHelper.init(null);

            //talkingdataSdk xuhua
            TalkingdataSdk.Init(activity);

            SdkJniHelper.onSetClassLoaderFrom(activity);

            SDKCore.getInstance().init(activity, getSDKConfigData());

            SDKCore.getInstance().setSDKListener(new ISDKListener() {
    
    

                @SuppressLint("ShowToast")
                @Override
                public void onResult(int arg0, String msg) {
    
    
                    Toast.makeText(SDKCore.getInstance().getContext(), msg, Toast.LENGTH_SHORT);
                }
                @SuppressLint("ShowToast")
                @Override
                public void onLogout() {
    
    
                    curLoginResult = null;
                }

                @SuppressLint("ShowToast")
                @Override
                public void onRestartGame(final String title) {
    
    
                    SDKCore.getInstance().runOnMainThread(new Runnable() {
    
    
                        @Override
                        public void run() {
    
    
                            new AlertDialog.Builder(SDKCore.getInstance().getContext())
                                    .setMessage(title)
                                    .setNeutralButton("确定", new DialogInterface.OnClickListener() {
    
    
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
    
    
                                            dialog.dismiss();

                                            Activity main = SDKCore.getInstance().getContext();
                                            Intent restartIntent = new Intent(main, SplashActivity.class);
                                            int pendingId = 1;
                                            PendingIntent pendingIntent = PendingIntent.getActivity(main, pendingId, restartIntent, PendingIntent.FLAG_CANCEL_CURRENT);
                                            AlarmManager mgr = (AlarmManager) main.getSystemService(Context.ALARM_SERVICE);
                                            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, pendingIntent);

                                            android.os.Process.killProcess(android.os.Process.myPid());
                                        }
                                    })
                                    .setCancelable(false).create().show();
                        }
                    });
                }

                @SuppressLint("ShowToast")
                @Override
                public void onLoginResult(LoginResult loginResult) {
    
    
//                Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);

                    isLogin = true;

                    if (curLoginResult != null && !curLoginResult.getAccessId().equals(loginResult.getAccessId())) {
    
    
                        onRepeatLogin();
                    } else {
    
    
                        curLoginResult = loginResult;

                        if (BuildConfig.MODULE_TYPE.equals("unity"))
                            SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
                        else
                            SdkJniHelper.onLoginToCocos(loginResult);
                    }
//                    curLoginResult = loginResult;
//                    if (!SdkJniHelper.onLoginToCocos(loginResult)) {
    
    
//                        onRepeatLogin();
//                    }
                }

                @SuppressLint("ShowToast")
                @Override
                public void onGoToTitle()
                {
    
    
                    SdkJniHelper.gameGoToTitle();
                }

                @SuppressLint("ShowToast")
                @Override
                public void onLoginResultNoCheck(LoginResult loginResult) {
    
    
//                Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);

                    isLogin = true;
                    curLoginResult = loginResult;

                    if (BuildConfig.MODULE_TYPE.equals("unity"))
                        SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
                    else
                        SdkJniHelper.onLoginToCocos(loginResult);

                }

                @SuppressLint("ShowToast")
                @Override
                public void onSwithAccountResult(LoginResult loginResult) {
    
    
//                Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);

                    if (curLoginResult != null && !curLoginResult.getAccessId().equals(loginResult.getAccessId())) {
    
    
                        onRepeatLogin();
                    } else {
    
    
                        curLoginResult = loginResult;

                        if (BuildConfig.MODULE_TYPE.equals("unity"))
                            SdkJniHelper.onLoginToUnity(BuildConfig.MSG_RECEIVER_NAME, loginResult);
                        else
                            SdkJniHelper.onLoginToCocos(loginResult);
                    }

//                    if (isLogin) {
    
    
//                        onRepeatLogin();
//                    }
                }

                @SuppressLint("ShowToast")
                @Override
                public void onPayResult(PayResult payResult) {
    
    
//                Toast.makeText(MainActivity.this, "登录成功,sid:" + loginResult.getAccessId(), Toast.LENGTH_SHORT);

                    if (BuildConfig.MODULE_TYPE.equals("unity"))
                        SdkJniHelper.onPayToUnity(BuildConfig.MSG_RECEIVER_NAME, payResult);
                    else
                        SdkJniHelper.onPayToCocos(payResult);
                }

                @SuppressLint("ShowToast")
                @Override
                public void onQuerySkuCurrencyResult(String var1) {
    
    

                }
            });
        }
    }

    @Override
    public void onActivityStarted(Activity activity){
    
    
        Log.d("GameActivityNew", "onActivityStarted");
    }

    @Override
    public void onActivityResumed(Activity activity){
    
    
        Log.d("GameActivityNew", "onActivityResumed");
    }

    @Override
    public void onActivityPaused(Activity activity){
    
    
        Log.d("GameActivityNew", "onActivityPaused");
    }

    @Override
    public void onActivityStopped(Activity activity){
    
    
        Log.d("GameActivityNew", "onActivityStopped");
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState){
    
    
        Log.d("GameActivityNew", "onActivitySaveInstanceState");
    }

    @Override
    public void onActivityDestroyed(Activity activity){
    
    
        Log.d("GameActivityNew", "onActivityDestroyed");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41165567/article/details/108128581