<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Android獲取狀態(tài)欄高度、標題欄高度、編輯區(qū)域高度

      一、Activity界面的劃分

         

       簡單說明一下(上圖Activity采用默認Style,狀態(tài)欄和標題欄都會顯示):最大的草綠色區(qū)域是屏幕界面,紅色次大區(qū)域我們稱之為“應用程序界面區(qū)域”,最小紫色的區(qū)域我們稱之為“View繪制區(qū)域”;屏幕頂端、應用界面區(qū)之外的那部分顯示手機電池網(wǎng)絡運營商信息的為“狀態(tài)欄”,應用區(qū)域頂端、View繪制區(qū)外部顯示Activity名稱的部分我們稱為“標題欄”。

      二、狀態(tài)高度的測量

              狀態(tài)欄是顯示顯示手機狀態(tài)(如電池電量、網(wǎng)絡狀態(tài)、時間、運營商信息等)的區(qū)域,一般內(nèi)容型應用都會顯示保留狀態(tài)欄,但是游戲界面如果還保留狀態(tài)欄就不合適了,因為游戲界面要響應各種手勢,而狀態(tài)欄也會響應一些手勢,有可能引發(fā)錯誤操作,所以一般在游戲界面都會隱藏狀態(tài)欄,使游戲界面全屏顯示,關于設置全屏請查看《Android設置Activity全屏的兩種方式及Theme屬性解析》,繼續(xù)看狀態(tài)欄高度測量:
              狀態(tài)欄高度的測量我在這里提供4種方法:

            (1)通過系統(tǒng)尺寸資源獲取

              狀態(tài)欄高度定義在Android系統(tǒng)尺寸資源中status_bar_height,但這并不是公開可直接使用的,例如像通常使用系統(tǒng)資源那樣android.R.dimen.status_bar_height。但是系統(tǒng)給我們提供了一個Resource類,通過這個類可以獲取資源文件,借此可以獲取到status_bar_height
      /** 
      * 獲取狀態(tài)欄高度——方法1 
      * */  
      int statusBarHeight1 = -1;  
      //獲取status_bar_height資源的ID  
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");  
      if (resourceId > 0) {  
          //根據(jù)資源ID獲取響應的尺寸值  
          statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);  
      }  
      Log.e("-------", "狀態(tài)欄-方法1:" + statusBarHeight1)
      (2)通過R類的反射
              大家都知道Android的所有資源都會有惟一標識在R類中作為引用。我們也可以通過反射獲取R類的實例域,然后找status_bar_height
      /** 
       * 獲取狀態(tài)欄高度——方法2 
       * */  
       int statusBarHeight2 = -1;  
       try {  
          Class<?> clazz = Class.forName("com.android.internal.R$dimen");  
          Object object = clazz.newInstance();  
          int height = Integer.parseInt(clazz.getField("status_bar_height")  
                    .get(object).toString());  
          statusBarHeight2 = getResources().getDimensionPixelSize(height);  
       } catch (Exception e) {  
          e.printStackTrace();  
       }  
       Log.e("-------", "狀態(tài)欄-方法2:" + statusBarHeight2);  

      (3)借助應用區(qū)域的top屬性

              這就用到了開題時的那張屏幕區(qū)域劃分圖片,狀態(tài)欄位于屏幕最頂端,其位置從(0,0)開始,故而應用區(qū)域的頂端位置(高度 = Y坐標 - 0)即為狀態(tài)欄的高度
      /** 
      * 獲取狀態(tài)欄高度——方法3 
      * 應用區(qū)的頂端位置即狀態(tài)欄的高度 
      * *注意*該方法不能在初始化的時候用 
      * */  
      Rect rectangle= new Rect();  
      getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);  
      //高度為rectangle.top-0仍為rectangle.top  
      Log.e("-------", "狀態(tài)欄-方法3:" + rectangle.top); 
      *注意* 如果單單獲取statusBar高度而不獲取titleBar高度時,這種方法并不推薦大家使用,因為這種方法依賴于WMS(窗口管理服務的回調(diào))。正是因為窗口回調(diào)機制,所以在Activity初始化時執(zhí)行此方法得到的高度是0,這就是很多人獲取到statusBar高度為0的原因。這個方法推薦在回調(diào)方法onWindowFocusChanged()中執(zhí)行,才能得到預期結(jié)果

             (4)借助屏幕和應用區(qū)域高度

              還是看屏幕區(qū)域劃分圖,是不是狀態(tài)欄占滿了屏幕中除應用區(qū)域之外的全部呢?所以直接上代碼
      /** 
      * 獲取狀態(tài)欄高度——方法4 
      * 狀態(tài)欄高度 = 屏幕高度 - 應用區(qū)高度 
      * *注意*該方法不能在初始化的時候用 
      * */  
      //屏幕  
      DisplayMetrics dm = new DisplayMetrics();  
      getWindowManager().getDefaultDisplay().getMetrics(dm);  
      //應用區(qū)域  
      Rect outRect1 = new Rect();  
      getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);  
      int statusBar = dm.heightPixels - outRect1.height();  //狀態(tài)欄高度=屏幕高度-應用區(qū)域高度  
      Log.e("------------", "狀態(tài)欄-方法4:" + statusBar);  

             3、4這兩種方法其實本質(zhì)是一樣,所以如果單單獲取statusBar高度而不獲取titleBar高度時也不推薦大家使用,理由同上方法3

       三、標題欄高度的測量

              搞懂了上邊的原理,標題欄高度的測量也就手到擒來啦,依舊是屏幕區(qū)域劃分圖。這里也給出兩種方法,先給出公共代碼吧,就是獲取各區(qū)域(*注意*依舊是在Activity的回調(diào)方法onWindowFocusChanged()中執(zhí)行,才能得到預期結(jié)果)
           //屏幕  
              DisplayMetrics dm = new DisplayMetrics();  
              getWindowManager().getDefaultDisplay().getMetrics(dm);  
              Log.e("-------", "屏幕高:" + dm.heightPixels);  
        
              //應用區(qū)域  
              Rect outRect1 = new Rect();  
              getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);  
              Log.e("------", "應用區(qū)頂部" + outRect1.top);  
              Log.e("-------", "應用區(qū)高" + outRect1.height());  
                
              //View繪制區(qū)域  
              Rect outRect2 = new Rect();  
              getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);   
              Log.e("--------", "View繪制區(qū)域頂部-錯誤方法:" + outRect2.top);   //不能像上邊一樣由outRect2.top獲取,這種方式獲得的top是0,可能是bug吧  
              int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();   //要用這種方法  
              Log.e("--------", "View繪制區(qū)域頂部-正確方法:" + viewTop);  
              Log.e("--------", "View繪制區(qū)域高度:" + outRect2.height());  

      有時候獲取View繪制區(qū)時列出來的那個outRect2.top=0

      (1)top-top

      /** 
      * 獲取標題欄高度-方法1 
      * 標題欄高度 = View繪制區(qū)頂端位置 - 應用區(qū)頂端位置(也可以是狀態(tài)欄高度,獲取狀態(tài)欄高度方法3中說過了) 
      * */  
      int titleHeight1 = viewTop - outRect1.top;  
      Log.e("--------", "標題欄高度-方法1:" + titleHeight1);

      (2)高度-高度

      /** 
      * 獲取標題欄高度-方法2 
      * 標題欄高度 = 應用區(qū)高度 - View繪制區(qū)高度 
       * */  
      int titleHeight2 = outRect1.height() - outRect2.height();  
      Log.e("----------", "標題欄高度-方法2:" + titleHeight2); 

             四、注意事項

              *注意* 

              (1)不管你是否設置全屏模式,或是不顯示標題欄,在使用獲取狀態(tài)欄高度方法1和獲取狀態(tài)欄高度方法2都會測量到狀態(tài)欄的高度,理解原理就不難解釋——系統(tǒng)資源屬性是固定的、真實的,不管你是否隱瞞(隱藏或者顯示),它都在那里;

              (2)但是若使用獲取狀態(tài)欄高度方法3和獲取狀態(tài)欄高度方法4,以及獲取標題欄高度方法1和獲取標題欄高度方法2,都是依賴于WMS,是在界面構(gòu)建后根據(jù)View獲取的,所以顯示了就有高度,不顯示自然沒高度了。

          下面是驗證

          先設置Activity為全屏

       

      <activity  
      android:name=".MainActivity"  
      android:label="@string/app_name"  
                  android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"  
      android:screenOrientation="portrait" >  
      <intent-filter>  
            <action android:name="android.intent.action.MAIN" />  
        
            <category android:name="android.intent.category.LAUNCHER" />  
             </intent-filter>  
      </activity>  

              屏幕各區(qū)域獲取不變;

       

              輸出StatusBar和titleBar高度信息

      int titleHeight1 = viewTop - outRect1.top;  
      Log.e("--------", "驗證Statue高度:" + titleHeight1);  
      Log.e("--------", "驗證Title高度:" + outRect1.top);

       

       

      posted @ 2017-04-26 21:24  王世楨  閱讀(11437)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产乱妇无码大片在线观看| 国内精品卡一卡二卡三| 不卡一区二区国产在线| 国产精品国产三级国产av剧情 | 成人区人妻精品一区二区| 风韵丰满妇啪啪区老老熟女杏吧| 婷婷久久综合九色综合88| 中国女人和老外的毛片| 彭山县| 国产精品自在线拍国产手青青机版 | 中文字幕在线无码一区二区三区| 日本黄韩国色三级三级三| 日本少妇xxx做受| 女人与牲口性恔配视频免费| 国产SM重味一区二区三区| 国产91午夜福利精品| 国产精品成人无码久久久| 成人午夜福利免费专区无码| 国产精品中文一区二区| 国产高清av首播原创麻豆| 亚洲欧美日韩成人综合一区 | 一本色道婷婷久久欧美| 日韩精品 在线 国产 丝袜| 亚洲乱妇老熟女爽到高潮的片| 在线看片免费人成视久网| 亚洲欧美偷国产日韩| 亚洲AV成人片不卡无码| 亚欧洲乱码视频在线专区| 福利视频在线播放| 亚洲高清WWW色好看美女| 亚洲国产片一区二区三区| 午夜福利啪啪片| 亚洲国产精品一二三四五| 国产91久久精品一区二区| 深夜av在线免费观看| 国产老熟女一区二区三区| 偷拍精品一区二区三区 | 内射干少妇亚洲69XXX| 337p西西人体大胆瓣开下部| 国产成人精品永久免费视频| 天堂资源在线|