最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android全面屏適配與判斷超詳細(xì)講解

 更新時(shí)間:2023年01月20日 14:40:29   作者:itbird01  
這篇文章主要介紹了Android 全面屏適配及判斷是否為全面屏,全面屏手勢和虛擬導(dǎo)航欄的判斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

1.全面屏的適配

全面屏出現(xiàn)后,如果不做適配,屏幕上會出現(xiàn)上下黑邊,影響視覺效果。

針對此問題,Android官方提供了適配方案,即提高App所支持的最大屏幕縱橫比,實(shí)現(xiàn)起來也比較簡單,在AndroidManifest.xml中做如下配置即可,在AndroidManifet里的下聲明:

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

將ratio_float設(shè)置為2.1即可適配一眾全面屏手機(jī),即:

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

2.判斷是否為全面屏

很多的手機(jī)是有虛擬導(dǎo)航欄的,特別是華為手機(jī),有人提議通過判斷是否含有虛擬導(dǎo)航欄,不就可以判斷是否為全面屏了嗎?

/**
     * 判斷設(shè)備是否存在NavigationBar(虛擬導(dǎo)航欄)
     *
     * @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是靜態(tài)方法,所以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;
    }

通過檢驗(yàn)發(fā)現(xiàn),此方法并不能判斷是否為全面屏,因?yàn)槿嫫恋氖謾C(jī)通過以上方法,判斷的值為:true。

因此,需要從其他方面進(jìn)行判斷,全面屏與傳統(tǒng)屏的區(qū)別在于,屏幕的縱橫比,所以,可以從縱橫比方面做出判斷,詳細(xì)代碼如下:

 /**
     * 判斷是否是全面屏
     */
    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兼容適配有虛擬導(dǎo)航欄手機(jī)和全面屏的顯示時(shí),底部被虛擬導(dǎo)航欄遮蓋,或者全面屏手機(jī)下方有間隙。

3.全面屏手機(jī)的虛擬導(dǎo)航和全面屏手勢的判斷

全面屏手機(jī)手勢是一特色,但也還是有習(xí)慣了用虛擬導(dǎo)航欄的,因此在判斷是否為全面屏手機(jī)的基礎(chǔ)上,需要做虛擬導(dǎo)航欄的適配;

判斷是否啟用虛擬導(dǎo)航的方法:

  /**
     * 判斷全面屏是否啟用虛擬鍵盤
     */
    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;
    }

直接用這個(gè)方法,會發(fā)現(xiàn)不起作用,需要在 onCreate(Bundle savedInstanceState)方法中加入一下代碼:

  //設(shè)置底部導(dǎo)航欄顏色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.white));
        }

這個(gè)既可以作為修改導(dǎo)航欄顏色,也是必須的,否則判斷是否啟用虛擬導(dǎo)航的方法的無效。

到此這篇關(guān)于Android全面屏適配與判斷超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Android全面屏適配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • listView的item中有checkbox,導(dǎo)致setOnItemClick失效的原因及解決辦法

    listView的item中有checkbox,導(dǎo)致setOnItemClick失效的原因及解決辦法

    這篇文章主要介紹了listView的item中有checkbox,導(dǎo)致setOnItemClick失效的原因及解決辦法,需要的朋友可以參考下
    2017-01-01
  • Android編程使WebView支持HTML5 Video全屏播放的解決方法

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

    這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細(xì)的分析了全屏播放所涉及的相關(guān)技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下
    2015-10-10
  • Mac中配置gradle環(huán)境及使用android studio打包jar包與arr包的方法

    Mac中配置gradle環(huán)境及使用android studio打包jar包與arr包的方法

    這篇文章主要給大家介紹了關(guān)于在Mac中配置gradle環(huán)境,以及使用android studio打包jar包與arr包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)

    Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)

    因?yàn)锳ndroid官方從來沒有給出過沉浸式狀態(tài)欄這樣的命名,只有沉浸式模式(Immersive Mode)這種說法.下面通過本文給大家介紹Android沉浸式狀態(tài)欄微技巧,需要的朋友參考下
    2016-12-12
  • Flow如何解決背壓問題的方法詳解

    Flow如何解決背壓問題的方法詳解

    這篇文章主要為大家介紹了Flow如何解決背壓問題的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android實(shí)現(xiàn)文件的分割和組裝

    Android實(shí)現(xiàn)文件的分割和組裝

    這篇文章主要介紹了Android實(shí)現(xiàn)文件的分割和組裝,針對UDP大數(shù)據(jù)包的分割傳輸與組裝有著非常實(shí)用的價(jià)值,需要的朋友可以參考下
    2014-09-09
  • 基于flutter?sound插件實(shí)現(xiàn)錄音與播放功能

    基于flutter?sound插件實(shí)現(xiàn)錄音與播放功能

    這篇文章主要介紹了基于flutter?sound插件實(shí)現(xiàn)錄音與播放功能,介紹了如何錄音,如何播放本地和遠(yuǎn)程音頻文件,以及如何實(shí)現(xiàn)動畫,在錄制完音頻文件后如何上傳,這些都是我們平常使用這個(gè)功能會遇到的問題。在使用的過程中遇到的問題也有列出,需要的朋友可以參考下
    2022-05-05
  • Android Studio下無線調(diào)試的方法

    Android Studio下無線調(diào)試的方法

    這篇文章主要為大家詳細(xì)介紹了Android Studio平臺下無線調(diào)試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android?App設(shè)計(jì)規(guī)范深入講解

    Android?App設(shè)計(jì)規(guī)范深入講解

    隨著安卓智能手機(jī)不停的更新?lián)Q代,安卓手機(jī)系統(tǒng)越來越完美,屏幕尺寸也越來越大啦,下面這篇文章主要給大家介紹了關(guān)于Android?App設(shè)計(jì)規(guī)范的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Android Studio配置國內(nèi)鏡像源(利用hosts)

    Android Studio配置國內(nèi)鏡像源(利用hosts)

    這篇文章主要介紹了Android Studio配置國內(nèi)鏡像源(利用hosts),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

炎陵县| 西青区| 吕梁市| 昔阳县| 宁陕县| 中江县| 宝山区| 三原县| 泊头市| 阜康市| 集贤县| 剑河县| 马尔康县| 洛隆县| 宜章县| 杭锦后旗| 陆丰市| 高阳县| 平潭县| 剑阁县| 阜新| 乐安县| 阿合奇县| 萨嘎县| 桦南县| 昌邑市| 晋宁县| 莫力| 行唐县| 密云县| 桓台县| 七台河市| 繁昌县| 黔江区| 泸水县| 赫章县| 青川县| 安仁县| 金坛市| 太原市| 平凉市|