1. 程式人生 > >Android螢幕適配解析

Android螢幕適配解析

 1、螢幕支援API

是Android 3.2值得重點關注的內容。google在此專門對平板的螢幕支援進行了擴充套件。另外,增加對高解析度電視顯示的支援。由此,可以看出,未來的Android除了佈局智慧機和平板外,同時看好智慧電視以及相關的大螢幕顯示裝置。為了支援大螢幕和高解析度,Android 3.2引入了質量資格,我將其理解為為了更好的在目標螢幕上進行介面佈局,而引入的用來指定顯示空間門檻。進而引出另外兩個概念:smallestWidth(swNNNdp)、螢幕的width(wNNNdp)和height(hNNNdp)。前者指的是螢幕可繪製區域的寬度和高度中最小的那個(會把電視的高度當做寬度來使用),是螢幕的固定屬性,與顯示方向無關(不去關心螢幕的顯示方向)。

後者指的就是螢幕的可繪製區域,二者隨著螢幕的顯示方向不同,進行相應的切換。Android 3.2中可用的新的質量資格使用示例:

  1. res/layout/main_activity.xml   # For phones  
  2. res/layout-sw600dp/main_activity.xml   # For 7” tablets  
  3. res/layout-sw720dp/main_activity.xml   # For 10” tablets  
  4. res/layout-w600dp/main_activity.xml   # Multi-pane when enough width  寬度大於600DP
  5. res/layout-sw600dp-w720dp/main_activity.xml   # For large width 

例二:寬度1280*800的平板

在資源:value-w1280dp,value-w800dp,時,橫屏下使用value-w1280dp的資源,豎屏使用value-w800dp的資源。

在資源:value-sw800dp,value-sw1080dp時,橫屏下使用value-sw800dp的資源,豎屏下仍然使用value-sw800dp的資源。

在上訴四中資源同時存在,則優先採用sw資源,value-sw800dp

有些電視裝置對於sw和w的支援並不是很好,比如聯想電視,1920*1080,mdpi的裝置,當values-sw1080、values-sw1080-mdpi、values-sw1080-hdpi同時存在時,會預設採用values-sw1080-hdpi的值,在只有values、values-mdpi、values-hdpi時,會採用values-mdpi下面的值。

建議:具體的裝置適配的時候還是先測試下采用什麼下面的值。

一些經典螢幕的dp。
  • 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
  • 480dp: a tweener tablet like the Streak (480x800 mdpi).
  • 600dp: a 7” tablet (600x1024 mdpi).
  • 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).
dp和畫素之間的轉換關係。

mdpi時1畫素=1dp,;  hdpi時,1.5畫素=1dp

獲取螢幕畫素和dp的方法。

        TextView t = new TextView(this);
        t.setText("解析度:"+getString(R.string.test));
        
        
     // 方法1 Android獲得螢幕的寬和高
        int screenWidth;
        int screenHeight;
 
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        screenWidth = display.getWidth();
        screenHeight = display.getHeight();
 
        // 方法2
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
 
        //獲得手機的寬度和高度畫素單位為px
        String str = "\n 方法1 手機螢幕解析度為:" + screenWidth +" * "+ screenHeight + "/n方法2  手機螢幕解析度為:" + dm.widthPixels +" * "+ dm.heightPixels;
        
        
        final float scale = this.getResources().getDisplayMetrics().density;
        
        t.setText(t.getText()+str + "\n密度:"+scale +"dip:"+px2dip(this, screenWidth));
        
        setContentView(t);

如果佈局採用layout-sw720dp ,layout-sw1280dp等根據螢幕的解析度來適配的,則佈局屬性應採用px畫素值來決定而不是採用dp單位

如果佈局採用layout-hdpi,layout-mdpi,layout-ldpi根據螢幕的dpi來適配的,則佈局屬性應採用dp單位。

更多的請參考:http://developer.android.com/guide/practices/screens_support.html#density-independence