我爱编程

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

2018-04-12  本文已影响969人  brucevanfdm
题图

前言

毫无疑问,当夏普发布全球首款“异形全面屏”手机——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外,另外两家设备都测试过了,有相关设备的开发者可以自行测试一下,欢迎评论私信反馈。

结语

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

上一篇下一篇

猜你喜欢

热点阅读