Android全面屏适配与判断超详细讲解

 更新时间:2023年01月20日 14:40:29   作者:itbird01  
这篇文章主要介绍了Android 全面屏适配及判断是否为全面屏,全面屏手势和虚拟导航栏的判断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

1.全面屏的适配

全面屏出现后,如果不做适配,屏幕上会出现上下黑边,影响视觉效果。

针对此问题,Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比,实现起来也比较简单,在AndroidManifest.xml中做如下配置即可,在AndroidManifet里的下声明:

<meta-data android:name="android.max_aspect"  
           android:value="ratio_float"/>

将ratio_float设置为2.1即可适配一众全面屏手机,即:

 <meta-data
            android:name="android.max_aspect"
            android:value="2.1" />

2.判断是否为全面屏

很多的手机是有虚拟导航栏的,特别是华为手机,有人提议通过判断是否含有虚拟导航栏,不就可以判断是否为全面屏了吗?

/**
     * 判断设备是否存在NavigationBar(虚拟导航栏)
     *
     * @return true 存在, false 不存在
     */
    public static boolean deviceHasNavigationBar() {
        boolean haveNav = false;
        try {
            //1.通过WindowManagerGlobal获取windowManagerService
            // 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
            Class<?> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal");
            Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService");
            getWmServiceMethod.setAccessible(true);
            //getWindowManagerService是静态方法,所以invoke null
            Object iWindowManager = getWmServiceMethod.invoke(null);
            //2.获取windowMangerService的hasNavigationBar方法返回值
            // 反射方法:haveNav = windowManagerService.hasNavigationBar();
            Class<?> iWindowManagerClass = iWindowManager.getClass();
            Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar");
            hasNavBarMethod.setAccessible(true);
            haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return haveNav;
    }

通过检验发现,此方法并不能判断是否为全面屏,因为全面屏的手机通过以上方法,判断的值为:true。

因此,需要从其他方面进行判断,全面屏与传统屏的区别在于,屏幕的纵横比,所以,可以从纵横比方面做出判断,详细代码如下:

 /**
     * 判断是否是全面屏
     */
    private volatile static boolean mHasCheckAllScreen;
    private volatile static boolean mIsAllScreenDevice;
    public static boolean isAllScreenDevice(Context 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;
    }

例如:此判断在PopupWindow兼容适配有虚拟导航栏手机和全面屏的显示时,底部被虚拟导航栏遮盖,或者全面屏手机下方有间隙。

3.全面屏手机的虚拟导航和全面屏手势的判断

全面屏手机手势是一特色,但也还是有习惯了用虚拟导航栏的,因此在判断是否为全面屏手机的基础上,需要做虚拟导航栏的适配;

判断是否启用虚拟导航的方法:

  /**
     * 判断全面屏是否启用虚拟键盘
     */
    private static final String NAVIGATION = "navigationBarBackground";
    public static boolean isNavigationBarExist(@NonNull Activity activity) {
        ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
        if (vp != null) {
            for (int i = 0; i < vp.getChildCount(); i++) {
                vp.getChildAt(i).getContext().getPackageName();
               
                if (vp.getChildAt(i).getId()!=-1&& NAVIGATION.equals(activity.getResources().getResourceEntryName(vp.getChildAt(i).getId()))) {
                    return true;
                }
            }
        }
        return false;
    }

直接用这个方法,会发现不起作用,需要在 onCreate(Bundle savedInstanceState)方法中加入一下代码:

  //设置底部导航栏颜色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.white));
        }

这个既可以作为修改导航栏颜色,也是必须的,否则判断是否启用虚拟导航的方法的无效。

到此这篇关于Android全面屏适配与判断超详细讲解的文章就介绍到这了,更多相关Android全面屏适配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • listView的item中有checkbox,导致setOnItemClick失效的原因及解决办法

    listView的item中有checkbox,导致setOnItemClick失效的原因及解决办法

    这篇文章主要介绍了listView的item中有checkbox,导致setOnItemClick失效的原因及解决办法,需要的朋友可以参考下
    2017-01-01
  • Android编程使WebView支持HTML5 Video全屏播放的解决方法

    Android编程使WebView支持HTML5 Video全屏播放的解决方法

    这篇文章主要介绍了Android编程使WebView支持HTML5 Video全屏播放的解决方法,较为详细的分析了全屏播放所涉及的相关技巧,并给出了完整代码下载地址供读者参考,需要的朋友可以参考下
    2015-10-10
  • Mac中配置gradle环境及使用android studio打包jar包与arr包的方法

    Mac中配置gradle环境及使用android studio打包jar包与arr包的方法

    这篇文章主要给大家介绍了关于在Mac中配置gradle环境,以及使用android studio打包jar包与arr包的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Android沉浸式状态栏微技巧(带你真正理解沉浸式模式)

    Android沉浸式状态栏微技巧(带你真正理解沉浸式模式)

    因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法.下面通过本文给大家介绍Android沉浸式状态栏微技巧,需要的朋友参考下
    2016-12-12
  • Flow如何解决背压问题的方法详解

    Flow如何解决背压问题的方法详解

    这篇文章主要为大家介绍了Flow如何解决背压问题的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android实现文件的分割和组装

    Android实现文件的分割和组装

    这篇文章主要介绍了Android实现文件的分割和组装,针对UDP大数据包的分割传输与组装有着非常实用的价值,需要的朋友可以参考下
    2014-09-09
  • 基于flutter sound插件实现录音与播放功能

    基于flutter sound插件实现录音与播放功能

    这篇文章主要介绍了基于flutter sound插件实现录音与播放功能,介绍了如何录音,如何播放本地和远程音频文件,以及如何实现动画,在录制完音频文件后如何上传,这些都是我们平常使用这个功能会遇到的问题。在使用的过程中遇到的问题也有列出,需要的朋友可以参考下
    2022-05-05
  • Android Studio下无线调试的方法

    Android Studio下无线调试的方法

    这篇文章主要为大家详细介绍了Android Studio平台下无线调试的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android App设计规范深入讲解

    Android App设计规范深入讲解

    随着安卓智能手机不停的更新换代,安卓手机系统越来越完美,屏幕尺寸也越来越大啦,下面这篇文章主要给大家介绍了关于Android App设计规范的相关资料,需要的朋友可以参考下
    2022-10-10
  • Android Studio配置国内镜像源(利用hosts)

    Android Studio配置国内镜像源(利用hosts)

    这篇文章主要介绍了Android Studio配置国内镜像源(利用hosts),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论