美文网首页我爱编程
漫谈Android手机刘海屏(附工具类)

漫谈Android手机刘海屏(附工具类)

作者: brucevanfdm | 来源:发表于2018-04-12 22:40 被阅读969次
    题图

    前言

    毫无疑问,当夏普发布全球首款“异形全面屏”手机——AQUOS S2时,是被开发者甚至用户所唾弃的。但是苹果刘海屏iPhone X的到来,让人们慢慢接受了这一妥协的设计方案。直到今天,大批Android手机厂商的跟进,把整个移动开发行业都带进了刘海屏的深坑。
    相对于苹果单一的设备/系统,适配刘海屏还是比较容易的。然而,在目前的Android生态下,不同的厂商,不同的定制系统,有着不同的刘海面积......

    现状

    目前就国内的手机厂商来说,已经推出刘海屏的厂商有华为、OPPO、VIVO,传言小米也即将推出刘海屏手机。基本上国内五大厂商都推出了自己的刘海屏手机(另一个是苹果),还有其他如LG,一加等等的刘海屏手机也在路上了。2018年的今天,刘海屏的应用适配已经不容忽视了。

    刘海屏手机

    适配

    关于全面屏即18:9非异形屏幕适配方案可以参考笔者之前的文章:

    在推出自家的刘海屏收集后,大部分厂商也在开发者平台中更新了适配的文档:

    其中大都提到了屏幕安全区的概念,以及判断是否为刘海屏手机的方法,具体细节可以参考官方文档。由于目前Android P仍未发布,Android生态中尚未官方支持刘海屏,所以各家的方案实现都有不同,这也给我们开发者带来了额外的适配成本。

    工具类

    根据VIVO、OPPO、华为官方文档,这里整理了一个刘海屏工具类,判断设备是否为刘海屏,其他厂商公布相关方法后也会在此更新。

    OPPO:

        /**
         * OPPO
         *
         * @param context Context
         * @return hasNotch
         */
        public static boolean hasNotchInOppo(Context context) {
            return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");
        }
    

    VIVO:

        /**
         * VIVO
         * <p>
         * android.util.FtFeature
         * public static boolean isFeatureSupport(int mask);
         * <p>
         * 参数:
         * 0x00000020表示是否有凹槽;
         * 0x00000008表示是否有圆角。
         *
         * @param context Context
         * @return hasNotch
         */
        private static boolean hasNotchInVivo(Context context) {
        boolean hasNotch = false;
        try {
            ClassLoader cl = context.getClassLoader();
            Class ftFeature = cl.loadClass("android.util.FtFeature");
            Method[] methods = ftFeature.getDeclaredMethods();
            if (methods != null) {
                for (int i = 0; i < methods.length; i++) {
                    Method method = methods[i];
                    if (method.getName().equalsIgnoreCase("isFeatureSupport")) {
                        hasNotch = (boolean) method.invoke(ftFeature, 0x00000020);
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            hasNotch = false;
        }
        return hasNotch;
    }
    

    华为:

        /**
         * HUAWEI
         * com.huawei.android.util.HwNotchSizeUtil
         * public static boolean hasNotchInScreen()
         *
         * @param context Context
         * @return hasNotch
         */
        public static boolean hasNotchInHuawei(Context context) {
            boolean hasNotch = false;
            try {
                ClassLoader cl = context.getClassLoader();
                Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");
                Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");
                hasNotch = (boolean) get.invoke(HwNotchSizeUtil);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return hasNotch;
        }
    

    除了OPPO的判断简单点外,其他两家厂商都是用反射来获取刘海屏幕信息的。除了VIVO外,另外两家设备都测试过了,有相关设备的开发者可以自行测试一下,欢迎评论私信反馈。

    结语

    最后,不得不感叹苹果的号召力。跟风也好,抄袭也罢,最为开发者,吐槽之后,还是得做好应用适配。

    相关文章

      网友评论

        本文标题:漫谈Android手机刘海屏(附工具类)

        本文链接:https://www.haomeiwen.com/subject/zmofkftx.html