欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android手机全面屏适配

程序员文章站 2022-06-25 15:06:54
package jp.co.cybird.android.magicaldays;import android.app.Activity;import android.app.Application;import android.content.Context;import android.graphics.Canvas;import android.graphics.Point;import android.os.Build;import android.os.Bundle;import...
package jp.co.cybird.android.magicaldays;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
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.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.opd2c.magicaldays.bs.R;

public class GameActivityNew implements Application.ActivityLifecycleCallbacks {
    //标准屏宽比
    private float mStandardScreenAspectRatio = 1.68f;

    //屏幕分辨率
    private int screenWidth;
    private int screenHeight;

    private boolean mHasCheckAllScreen;

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

        if (className.endsWith("GameActivity")){

            return true;
        }
        return false;
    }

    //判断是否是全面屏
    private boolean IsAllScreenDevice(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;
            }
        }
        return mIsAllScreenDevice;
    }

    //隐藏下方手机的返回按钮界面
    private void HideBottomKey(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Log.d("GameActivityNew","KITKAT");
            View decorView = activity.getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    //允许应用显示全面屏
    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");
        }
    }

    @Override
    public void onActivityCreated(final Activity activity, Bundle savedInstanceState){
        if(IsMainActivity(activity)){
            HideBottomKey(activity);
            AllowFullScreenDisplay(activity);
            if(IsAllScreenDevice(activity)){
                //获取手机屏幕分辨率(宽:dm.widthPixels,高:dm.heightPixels)
                DisplayMetrics dm = new DisplayMetrics();
                activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
                screenWidth = dm.widthPixels;
                screenHeight = dm.heightPixels;
                Log.d("GameActivityNew", "widthPixels=" + screenWidth);
                Log.d("GameActivityNew", "heightPixels=" + screenHeight);

                //获取游戏主activity的根layout对象,方便在游戏在屏幕上下方绘制图片,做全面屏适配
                final ViewGroup vg=(ViewGroup)activity.getWindow().getDecorView();
//                activity.getWindow().getDecorView().post(new Runnable() {
//                    @Override
//                    public void run() {
//                        Log.d("GameActivityNewh", Integer.toString( vg.getChildAt(1).getHeight()));
//                    }
//                });
                //顶部图片
                ImageView img = new ImageView(activity);
                //设置图片的长宽
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(screenWidth, 196);
                img.setLayoutParams(layoutParams);
                //设置图片的icon
                img.setImageResource(R.drawable.base);
                //创建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, 0, 0, 0);
                RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(margin);
                img.setLayoutParams(layoutParams3);
                vg.addView(img);

                //底部图片
                ImageView img2 = new ImageView(activity);
                RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(screenWidth, 196);
                img2.setLayoutParams(layoutParams2);
                img2.setImageResource(R.drawable.base1);
                ViewGroup.MarginLayoutParams margin2 = new ViewGroup.MarginLayoutParams(img2.getLayoutParams());
                margin2.setMargins(0, screenHeight - 94 , 0, 0);
                RelativeLayout.LayoutParams layoutParams4 = new RelativeLayout.LayoutParams(margin2);
                img2.setLayoutParams(layoutParams4);
                vg.addView(img2);
            }
        }
    }

    @Override
    public void onActivityStarted(Activity activity){

    }

    @Override
    public void onActivityResumed(Activity activity){

    }

    @Override
    public void onActivityPaused(Activity activity){

    }

    @Override
    public void onActivityStopped(Activity activity){

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState){

    }

    @Override
    public void onActivityDestroyed(Activity activity){

    }
}

本文地址:https://blog.csdn.net/qq_41165567/article/details/108128581

相关标签: android开发

上一篇: RxBinding的使用

下一篇: 付出代价