Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android適配全攻略(學習筆記總結)

Android適配全攻略(學習筆記總結)

編輯:關於Android編程

一、為什麼要進行屏幕適配

某廠商統計如下數據

2012年,支持Android的設備共有3997種 2013年,支持Android的設備共有11868種 2014年,支持Android的設備共有18796種 2015年,支持Android的設備的共有24093種 http://www.sfw.cn/xinwen/471726.html(2015年統計,裡面包含android設備,廠家,碎片化)

二、屏幕適配對象

我們到底應該對哪些屏幕進行適配

首先來看下最新的Android設備分辨率(2016年)
\

進行適配的還是以上的主流的幾個分辨率

三、重要概念

(1)、什麼是屏幕尺寸、屏幕分辨率、屏幕像素密度

屏幕尺寸
屏幕尺寸指屏幕的對角線的長度 單位是英寸,1英寸=2.54厘米
屏幕分辨率
屏幕分辨率是指橫縱向撒花姑娘的像素點數 單位是px ,1px=1個像素點 一般以縱像素*橫向像素,如1920*1080
屏幕像素密度
屏幕像素密度是指每英寸上的像素點數 單位是dpi,即“dot per inch”的縮寫 屏幕像素密度與屏幕尺寸和屏幕分辨率有關 如Nexus 5
屏幕4.95 1920*1080 445dpi 1920^2+1080^2 進行開方 然後除以對角線長度4.95 等於445

(2)、什麼是dp,dip,dpi,sp、px ?之間的關系是什麼?

px
構成圖像的最小單位
dp 、dip
Density Independent Pixels的縮寫,即密度無關像素 以160dpi為基准,1dpi = 1px
sp
即Scale-Independent Pixels 可以根據文字大小首選項進行縮放 絕大部分用於文字的大小推薦12sp、14sp、18sp、22sp

(3)、什麼是mdpi、hdpi、xdpi、xxdpi、xxxdpi?如何計算和區分?

在新創建項目的時候,會自動創建不同的drawable或者mipmap文件夾(在不同像素密度上提供不同的圖片)
或者不同的value下面(在不同像素密度提供不同的值)dimens.xml(這個放在不同的values下面)

名稱 像素密度范圍 mdpi 120dpi-160dpi hdpi 160dpi-240dpi xhdpi 240dpi-320dpi xxhdpi 320dpi-480dpi xxxhdpi 480dpi-640dpi

四、解決方案

支持各種屏幕尺寸

使用wrap_content、match_parent、weight

\
如果是下面的match_parent的情況<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">

\
這裡就介紹一下:

weight
計算出的寬度 = 原來的寬度 + 剩余空間所占百分比寬度
假設屏幕的寬度是L
 0 + (L) * 1/3  = 1/3L" data-snippet-id="ext.022f7a22bc4dfd4d4b09d722fe5706e5" data-snippet-saved="false" data-codota-status="done">BUTTON1為例 (第二種的0dp寬度)
1/3L   --> 0 + (L) * 1/3  = 1/3L
 L + (L-2L) * 1/3  = 2/3L" data-snippet-id="ext.8c46fa107bb72b8f27cfe1e5a92180b8" data-snippet-saved="false" data-codota-status="done">BUTTON1為例 (第二種的match_parent)
2/3L   --> L + (L-2L) * 1/3  = 2/3L

通過以上的算法,就知道了為啥上面的兩個圖的顯示大小了,同時高度也是同樣的適用。

使用相對布局,禁用絕對布局
一般使用線性布局LinearLayout、相對布局RelativeLayout、幀布局FrameLayout,不使用絕對布局AbsoluteLayout 使用限定符
使用尺寸限定符(android3.2之前)

    


res/layout-large/main.xml 雙面板   (當運行到平板的時候,就會選用下面的布局(大於7英寸))


    
    
" data-snippet-id="ext.73dd6555295e04511cfbc1609db52cbb" data-snippet-saved="false" data-codota-status="done">res/layout/main.xml 單面板



    


res/layout-large/main.xml 雙面板   (當運行到平板的時候,就會選用下面的布局(大於7英寸))


    
    
* 使用最小寬度限定符(android3.2之後)

    


res/layout-sw600dp/main.xml,雙面板布局:  Small Width 最小寬度(寬或者高最小的一邊大於600dp就是用以下布局)


    
    
" data-snippet-id="ext.34fc12d4bd715cd69deff1f1daa57a06" data-snippet-saved="false" data-codota-status="done">res/layout/main.xml,單面板(默認)布局:



    


res/layout-sw600dp/main.xml,雙面板布局:  Small Width 最小寬度(寬或者高最小的一邊大於600dp就是用以下布局)


    
    

如果適配android3.2之前,要有以上的兩個維護布

* 使用布局別名
    @layout/main


Android3.2之前的平板布局
res/values-large/layout.xml:

    @layout/main_twopanes


Android3.2之後的平板布局
res/values-sw600dp/layout.xml:

    @layout/main_twopanes
" data-snippet-id="ext.a2f2624a2e31671e55ac98c54e3a12dc" data-snippet-saved="false" data-codota-status="done">使用布局別名

res/layout/main.xml:            單面板布局
res/layout-large/main.xml:      多面板布局
res/layout-sw600dp/main.xml:    多面板布局


多面板布局共同部分抽取出來,生成main_twopanes文件
res/layout/main.xml             單面板布局
res/layout/main_twopanes.xml    雙面板布局

setContentView(R.layout.main);

默認布局
res/values/layout.xml:

    @layout/main


Android3.2之前的平板布局
res/values-large/layout.xml:

    @layout/main_twopanes


Android3.2之後的平板布局
res/values-sw600dp/layout.xml:

    @layout/main_twopanes
* 使用屏幕方向限定符
    @layout/main_twopanes


res/values-sw600dp-port/layouts.xml:

    @layout/main
" data-snippet-id="ext.31766eccfa490dd079a06b693a274abd" data-snippet-saved="false" data-codota-status="done">使用屏幕方向限定符

res/values-sw600dp-land/layouts.xml:

    @layout/main_twopanes


res/values-sw600dp-port/layouts.xml:

    @layout/main
小屏幕,縱向: 1.單面板 小屏幕,橫向: 單面板 7 英寸平板電腦,縱向: 2.單面板,帶操作欄 7 英寸平板電腦,橫向: 3.雙面板,寬,帶操作欄 10 英寸平板電腦,縱向: 4.雙面板,窄,帶操作欄 10 英寸平板電腦,橫向: 雙面板,寬,帶操作欄 電視,橫向: 雙面板,寬,帶操作欄

    
" data-snippet-id="ext.cb4d15bd9402420e29d19c8d7e1ba8c9" data-snippet-saved="false" data-codota-status="done">1.res/layout/onepane.xml:(單面板)


    
    
        
        
    
    
" data-snippet-id="ext.8d2453a1abeb37adbe012e0b54964af7" data-snippet-saved="false" data-codota-status="done">3.res/layout/twopanes.xml:(雙面板,寬布局)

    
    
    
    
" data-snippet-id="ext.0ba6ad717273a0c384fe8868c11ce221" data-snippet-saved="false" data-codota-status="done">4.res/layout/twopanes_narrow.xml:(雙面板,窄布局)

    
    
    @layout/onepane_with_bar
    false
" data-snippet-id="ext.14f5add08fd4c7665693603322bfadb8" data-snippet-saved="false" data-codota-status="done">1.res/values/layouts.xml:

    @layout/onepane_with_bar
    false
    @layout/twopanes
    true
" data-snippet-id="ext.7108a6526ed5370069380c2f5f039887" data-snippet-saved="false" data-codota-status="done">2.res/values-sw600dp-land/layouts.xml:

    @layout/twopanes
    true
    @layout/onepane
    false
" data-snippet-id="ext.762f4084290e68895fe0fed6cd13e965" data-snippet-saved="false" data-codota-status="done">3.res/values-sw600dp-port/layouts.xml:

    @layout/onepane
    false
    @layout/twopanes
    true
" data-snippet-id="ext.67ce1c1b62174a2990167a6644c08400" data-snippet-saved="false" data-codota-status="done">4.res/values-large-land/layouts.xml:

    @layout/twopanes
    true
    @layout/twopanes_narrow
    true
" data-snippet-id="ext.0219515502870f211bc80fd671dfc123" data-snippet-saved="false" data-codota-status="done">5.res/values-large-port/layouts.xml:

    @layout/twopanes_narrow
    true
使用自動拉伸位圖
就是.9圖的使用

支持各種屏幕密度

1、使用非密度制約像素

使用sp來控制文字的大小

使用dp來控制布局控件的位置(這裡有坑,看看下面)

由此可知,雖然我們已經使用了dp(密度無關)但是顯示還是不能達到統一的效果
\
問題的關鍵所在—>各種設備的寬度不是一致的,即使使用dp,也是會有誤差的。
解決思路—>不使用dp
多個values下面提供不同的dp值,(必須為每一種設備提供對應的資源文件,如果沒有,就去默認的資源文件裡面查找),但這個最終還是以px為單位的,這個就要自己斟酌了。
* 2、提供備用位圖
* 不同的屏幕密度提供相匹配的圖片
* 但是為了打包的小,一般還是一套圖,一些比較重要的匹配的,可以多切幾套圖
* 使用和設備相符合的,使用的內存占用是最小的

實施自適應用戶界面流程

1、確定當前布局 2、根據當前布局做出響應 3、重復使用其他活動中的片段 4、處理屏幕配置變化

最佳實踐

關於高清設計圖尺寸 動態設置
在使用popupwindow的時候動態設置布局
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved