1. 程式人生 > >僅僅是個人記錄:Android 的機型適配: 螢幕適配(包括dpi,dp,sp的概念) 版本適配 硬體適配。 以及如何和美工配合

僅僅是個人記錄:Android 的機型適配: 螢幕適配(包括dpi,dp,sp的概念) 版本適配 硬體適配。 以及如何和美工配合

最重要的適配就是尺寸適配,我們可以有兩種方案:


第一種方案,以某一個尺寸,例如1920*1080為基準的,在檔案中修改 http://blog.csdn.net/lmj623565791/article/details/45460089
        int baseW = 1080;
        int baseH = 1920;
然後生成相應的其他的尺寸的dimen檔案
這種的優點就是:可以直接根據美工的圖來輸入相應的數字就好了,然後一切都會自動的計算好的,當然美工的圖的尺寸和我們的基準尺寸要是一樣的
缺點就是有一些沒有考慮到的尺寸會有一點問題,軟體會較大


第二種方案,百分比的利用。http://blog.csdn.net/lmj623565791/article/details/46695347
這個方法很完美,可以解決上面沒有考慮到尺寸的問題,還有軟體較大的問題。
缺點:但是需要自己計算一次比例。


第三種方案,就是兩者相結合。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

螢幕畫素密度
螢幕畫素密度是指每英寸上的畫素點數,單位是dpi,即“dot per inch”的縮寫。
一英寸是2.54cm就是一英寸的照片的對角線。像我們的收銀機就有xdpi ydpi就是橫豎的dpi是不同的。

記住一個點就是dp 是密度無關的。

dip和dp是一個意思,都是Density Independent Pixels的縮寫,即密度無關畫素,上面我們說過,dpi是螢幕畫素密度,假如一英寸裡面有160個畫素,這個螢幕的畫素密度就是160dpi,那麼在這種情況下,dp和px如何換算呢?在Android中,規定以160dpi為基準,1dip=1px,如果密度是320dpi,則1dip=2px,以此類推。


最關鍵的就是圖片適配和尺寸適配,
圖片適配,我們一般是,其實就是5張圖片。

mdpi就是1倍	160dpi		480*320		2*2
hdpi就是1.5倍	240dpi		800*480		3*3	小手機
xhdpi就是2倍	320dpi		1280*720P	4*4
xxhdpi就是3倍	480dpi		1920*1080P 	6*6	大手機
xxxhdpi就是4倍	640dpi		2k的螢幕的適配	8*8




規則是,如果241dpi,那麼就呼叫320dpi的圖片來做。


我們可以按照手機螢幕的標準把800×480理解為hdpi,480×320為mdpi,320×240為ldpi,根據最新的資料顯示,Android所有手機中hdpi和mdpi佔

有九成以上的比例;還有1280×720、1920×1080等高解析度的android手機介面。


儘量使用wrap_content match_parent 和權重,如果要用那麼就是使用寬度適配的方式



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
尺寸適配,現在一般都是使用的,使用了權重以後,可以使用百分比來進行適配。
最小邊適配,寬度適配,高度適配。
在弘揚的部落格中,也有將px進行轉換的一些操作。
w511dp 就是寬度適配,h600dp就是高度適配,sw600dp就是最小邊適配


百分比首先要匯入包:

compile 'com.android.support:percent:23.4.0'

現在直接用hongyang的compile 'com.zhy:percent-support-extends:1.1.1'

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "tech.androidstudio.percentlayout"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:percent:23.4.0'
}


佈局裡面:

百分比裡面可以是小數點的。例如58.88%也是可以的

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tech.androidstudio.percentlayout.MainActivity">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="20%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:background="@android:color/holo_red_dark"
        app:layout_widthPercent="20%"
        app:layout_heightPercent="20%"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="80%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:layout_alignParentRight="true"
        android:background="@android:color/holo_blue_dark"
        app:layout_widthPercent="80%"
        app:layout_heightPercent="20%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="100%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:layout_alignParentBottom="true"
        android:background="@android:color/holo_purple"
        app:layout_widthPercent="100%"
        app:layout_heightPercent="20%"/>
</android.support.percent.PercentRelativeLayout>



++++++++++++++++++++++++++++參考++++++++++++++++++++++++++++++++
Android 6.0 = API Level 23
Android 5.1.1 = API Level 22
Android 5.0.1 = API Level 21 ++++++++++++我的手機
Android 4.4W (L) = API Level 20
Android 4.4.2 = API Level 19++++++++++++++++我們的收銀機
Android 4.3 = API Level 18
Android 4.2-4.2.2 = API Level 17
Android 4.1-4.1.1 = API Level 16
Android 4.0.3-4.0.4 = API Level 15
Android 4.0-4.0.2 = API Level 14
Android 3.2 = API Level 13
Android 3.1.x = API Level 12
Android 3.0.x = API Level 11
Android 2.3.3+ = API Level 10
2.2 v8 
2.1 v7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++







需要新增的部分:螢幕適配部分,需要把dp,dpi這些概念再看看。


1: 機型適配的目的就是能夠使應用程式能夠在絕大多數的手機上面穩定的正常的執行 
要求是,匹配,合適,正常和穩定。
機型適配主要分為:版本的適配(Build.VERSION),螢幕適配(手機和平板,不同的解析度的手機),語言國家適配(阿拉伯國家),硬體適配(


前置攝像頭,後置攝像頭)
而我們 平時將的適配,主要是螢幕適配:


版本的適配:要保證在android 的不同版本上面都能夠正常的穩定的執行。
++++++++++++++++++++++++++++++++++++++++++++++
例如android V6裡面的動態許可權請求.requestPermission.
 
例如如果我們用到了btn.setX()的方法那麼我們首先要通過Build.VERSION.SDK_INT>=11 來判斷是否可以使用。
if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


=========================================================================
螢幕適配:主要包含了圖片適配,介面橫豎屏適配,螢幕寬度高度大小適配,
關於圖片適配,因為android 會自動的根據螢幕來使用相應的圖片,我們一般會請美工做lhdpi,hdpi,xhdpi,xxhdpi,xxxhdpi,實在不行的話,


就是做兩個hdpi和xxhdpi這兩個,因為android 會自動的進行圖片的轉換。
關於橫豎屏的適配,首先建立一個layout-land的資料夾,我們可以單獨的給豎屏建立一個佈局,這個佈局名稱必須要和正常的豎屏裡面的名稱一樣


。這個時候切換橫屏的時候就可以使用這個佈局了。
關於螢幕寬度和高度大小適配,我們選擇使用dp和權重結合的方式來進行,文字的大小上面使用sp單位。然後測試幾個手機上面是否顯示是正常的


。就可以了。
=========================================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
語言適配,可以直接的新增一個檔案values-zh
右鍵res檔案,選擇建立資料夾,然後選擇-》values,在裡面找到Locale-》點選“》”,然後就可以選擇語言了。
這裡面也可以自己直接建立,如果自己知道語言的縮寫的話,例如中文就是values-zh


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
硬體的適配:例如我們要開發一個羅盤應用 ,首先 要判斷是否有羅盤這個感應器。沒有的話,就提醒使用者不能使用。




















版本的適配:例如我們的執行緒池的時候的時候在版本
++++++++++++++++++++++++++++++++++++++++++++++
例如android V6裡面的動態許可權請求.requestPermission. 
例如如果我們用到了btn.setX()的方法那麼我們首先要通過Build.VERSION.SDK_INT>=11 來判斷是否可以使用。
if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


++++++++++++++++++++++++++++參考++++++++++++++++++++++++++++++++
Android 6.0 = API Level 23
Android 5.1.1 = API Level 22
Android 5.0.1 = API Level 21
Android 4.4W (L) = API Level 20
Android 4.4.2 = API Level 19
Android 4.3 = API Level 18
Android 4.2-4.2.2 = API Level 17
Android 4.1-4.1.1 = API Level 16
Android 4.0.3-4.0.4 = API Level 15
Android 4.0-4.0.2 = API Level 14
Android 3.2 = API Level 13
Android 3.1.x = API Level 12
Android 3.0.x = API Level 11
Android 2.3.3+ = API Level 10
2.2 v8 
2.1 v7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


android api向來是高版本相容低版本.
如api-8(android2.2)必會相容api-4(android 1.6)
但是反之則不會,你使用2.2的平臺版本build了一個apk,若想能在1.6上執行,則需要做向下相容.
android support-xx是google官方的向下相容包.
如名所示,會幫助構建程式向下相容到1.6版本.不過也並非萬能的,還是會受限制.
上面的 解釋很正確 ,但是我們平時使用的多是v4,v7包,如果是這個是11裡面的呢?例如btn.setX,task.executeOnExecutor().
這樣對於,版本是10的東西,就不能夠使用了,那麼 就要判斷了。




Android 版本的適配:
1:使用Android support 包,實現高版本API的相容;
ActionBar就是v7包的,Fragment 是v4包
2:通常由於採用一些新的API相容包,那麼軟體最低支援Android 2.1就是API7
3:確認軟體最低支援版本的時候,需要分析使用API最低支援到那個版本;


例如如果設定最低的版本是9
現在設定一個
Button btn=null;
btn.setX(34);


Develpe-》Reference-》API level




版本適配:
1:確定最低版本,不要呼叫最低版本以上的任何程式碼
2:如果呼叫的高版本方法,有對應的低版本的代替
例如View.setX()高版本,可以使用View.setLeft+View.setRight()這種低版本方法,代替
那麼就可以通過程式碼來進行倒臺的適配;
android.os.Build 這個類,就可以獲取當前手機的各種資訊,包括version
Button btn=null;
if(Build.VERSION.SDK_INT>=11){
btn.setX(34);
}else{
Toast.....("您的手機不支援。。。")
}


if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


++++++++++++++++++++++++++++參考結束++++++++++++++++++++++++++++++++


=========================================================================
螢幕適配:主要包含了圖片適配,介面橫豎屏適配,螢幕寬度高度大小適配,
關於圖片適配,因為android 會自動的根據螢幕來使用相應的圖片,我們一般會請美工做lhdpi,hdpi,xhdpi,xxhdpi,xxxhdpi,實在不行的話,


就是做兩個hdpi和xxhdpi這兩個,因為android 會自動的進行圖片的轉換。
關於橫豎屏的適配,首先建立一個layout-land的資料夾,我們可以單獨的給豎屏建立一個佈局,這個佈局名稱必須要和正常的豎屏裡面的名稱一樣


。這個時候切換橫屏的時候就可以使用這個佈局了。
關於螢幕寬度和高度大小適配,我們選擇使用dp和權重結合的方式來進行,文字的大小上面使用sp單位。然後測試幾個手機上面是否顯示是正常的


。就可以了。
=========================================================================




參考:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi


選擇豎屏:
右鍵res,選擇directory
resoure type 選擇layout
選擇下面的Orientation 》》
選擇Screen orientation
選擇Land。。
就會有一個資料夾layout-land


進行機型適配,主要是在res目錄
1:圖片適配螢幕DPI
2:介面橫豎切換適配
3:螢幕寬度高度大小適配




res資料夾的命名規則:
resource name-修飾符
mipmap-xhdpi








++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
語言適配,可以直接的新增一個檔案values-zh
右鍵res檔案,選擇建立資料夾,然後選擇-》values,在裡面找到Locale-》點選“》”,然後就可以選擇語言了。
這裡面也可以自己直接建立,如果自己知道語言的縮寫的話,例如中文就是values-zh


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
硬體的適配:例如我們要開發一個羅盤應用 ,首先 要判斷是否有羅盤這個感應器。沒有的話,就提醒使用者不能使用。


硬體適配:
1:只有在清單檔案會有這個要求,應用市場裡裡面,我們的清單檔案會有作用的
應用市場軟體需要使用那些硬體,在清單檔案宣告;是否是必須的;


2:應用市場會根據手機的特性,顯示對應的軟體,根據清單檔案,過濾不支援的程式。
Trainning->Supporting Different Devices


<uses-feature android:name="android.hardware.camera" android:required="true"/>




SensorManager sensorManager =(SensorManager)getSystemService(SENSOR_SERVICE);
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROTER);






廣渠門 西單商場正對面  皁君廟 西壩河 遠大路 '




++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
版本適配 
        //獲取panel的高度
        int height = panel.getHeight();
        //設定縮放的中心點是右側的中點
        mContent.setPivotX(0);
        mContent.setPivotY(height/2);


        //設定縮放的等級
        mContent.setScaleX(1-slideOffset);
        mContent.setScaleY(1-slideOffset);




//如果要相容2.0的手機,2.0就是API5,2.1是API 7,2.3是API 9
//        http://blog.csdn.net/rodulf/article/details/50743187


//        ViewCompat.setPivotX(mContent, 0);
//        ViewCompat.setPivotX(mContent, height / 2);
//        ViewCompat.setScaleX(mContent, 1 - slideOffset);
//        ViewCompat.setScaleY(mContent, 1 - slideOffset);




硬體適配 :
例如下載的路徑預設是外部儲存的位置,如果有沒有儲存卡 ,那麼就是內部的儲存的位置。


if(Environment.MEDIA_MOUNTED.equals(state)){
            // MEDIA_MOUNTED 代表儲存卡可用, MOUNTED 稱作 "掛載"
 // 獲取外部儲存中,應用程式共享的目錄, 返回內容可能不存在

機型適配:

作用是使應用程式能夠在廣泛的軟體系統和硬體平臺上都可以正常的穩定的執行
作業系統的版本的適配。API
android 上面的手錶,平板電腦,
所有做客戶端的必須要做機型適配

機型適配的要求:
匹配,合適,正常,穩定。
需求:
1:支援Android2.1以上的版本,V7包
2:支援手機和平板電腦,螢幕適配
3:為阿拉伯國家提供軟體,阿拉伯國家的文字為從右向左
4:為中國移動提供軟體,wmwap
5:需要做一個拍照軟體,前置攝像頭,後置攝像頭
6:釋出到各種軟體市場,小米市場上,軟體的扉頁必須要有小米的標誌




如何進行機型適配(主要講解螢幕適配)


進行機型適配,主要是在res目錄
1:圖片適配螢幕DPI
2:介面橫豎切換適配
3:螢幕寬度高度大小適配
4:語言適配


res資料夾的命名規則:
resource name-修飾符
mipmap-xhdpi
values-zh




選擇豎屏:
右鍵res,選擇directory
resoure type 選擇layout
選擇下面的Orientation 》》
選擇Screen orientation
選擇Land。。
就會有一個資料夾values-land




android 優先選擇運營商,國外的手機在中國可能預設的就是英文的。
 
values/strings.xml
values-zh/strings.xml
values-zh_rTW/strings.xml  r代表region




螢幕適配:


Android 提供了自動的裝置檢測功能,能夠根據當前裝置,自動的使用合適的圖片。
-------------------------------------------------------------------------------------------------------
重點:美工給我們幾套圖。
答:可以直接給一個xhdpi的圖片和一個xxxhdpi的圖片,或者所有的圖片都給出來。前提是我們自己計算一下尺寸大小。
-------------------------------------------------------------------------------------------------------
例如紅米2手機解析度是720*1280,尺寸大概是2.3英寸*4英寸的,那麼dpi 就是xhdpi就是320,
那麼如果我現在有一張圖片在這個上面顯示的是。寬度的3分之一,高度的四分之一,
那麼這個xhdpi圖的大小是240px*220px。
那麼我會在要一個xxxhdpi的就是480*440的圖片。
------------------------------------------------------------------------------------------------------
之前是160px是標準的
但是我們開發的時候還是要以320px的為基準比較好。也就是說以手機尺寸為720*1280的為基準的,例如紅米2
------------------------------------------------------------------------------------------------------
那麼螢幕的dp到底多少呢?


例如紅米的螢幕分辨720*1280  dpi為2,
螢幕的dp大小為:360dp*640dp這個就是螢幕的dp. 這個其實也就是正常的螢幕的dp值了吧。


------------------------------------------------------------------------------------------------------




美工在出圖的時候是按照畫素單位來出圖的。
dpi:每一個手機,都有自己的硬體的螢幕引數dpi,
一英寸能夠顯示多少畫素。一英寸是多少呢?1英寸(in)=2.54釐米(cm),最簡單就是一寸照片的底部就是一寸長的。


通常第三個適配的時候,設計不同的dpi的圖片,例如
100px,240px,兩張圖片。名字都一樣放在不同的mipmap或者是drawable下面


dp虛擬的單位:dp以dpi為引數的單位,
公式:1dp=多少個px?    px=(dpi/160)*dp


那麼5dp=?px 例如mdpi=160, 5dp-> (160/160)*5=5px
             例如hdpi=240   5dp-》(240/160)*5dp=7.5px;
    例如xhdpi=320  5dp-> (320/160)*5dp=10px;


總螢幕大小是多少dp呢?
------------------------------------------------------------------------------------------------------
那麼螢幕的dp到底多少呢?


例如紅米的螢幕分辨720*1280  dpi為2,
螢幕的dp大小為:360dp*640dp這個就是螢幕的dp.
但是不同的機器的 螢幕的dp值也不一樣,例如紅米的2的變成了更大的尺寸,但是螢幕的解析度,沒有變的話,那麼dp就不會變。如果,尺寸沒變,但是解析度變大了,那麼dp就會變化。
dp=(dpi/160)px


在xml裡面預覽的左上角:有一個檔案標誌下面有一個機器人的,
點選後選擇 Preview reprentation Sample
可以檢視相同的dp值在不同的手機上面的變化。


------------------------------------------------------------------------------------------------------


注意在程式碼中如果沒有標示就都是px的。
----------------------------------------


標準是以mdpi為一準


ldpi 120   0.75x
mdpi 160   1x 最早的手機160個畫素一英寸。
hdpi 240   1.5x
xhdpi 320   2x
xxHDPI 480  3x
xxxHDPI 640 4X


現在軟體的切換都建議採用xhdpi進行設計,然後其餘的進行縮放
採用高清大圖來進行設計,切圖進縮放,




Pure Android
Devices and Displays
==============================================================
關於hdpi:
1:在不同的dpi目錄,設定同名的圖片,根據縮放比例,
進行圖片尺寸的設定。在小尺寸的手機上,顯示的內容儘量調整清晰。
在大尺寸圖片上面,調整圖片的細節,讓圖片顯示的內容更多,


2:相當於程式能夠同時支援 普通手機和高清版;


3:因為android系統如果沒有設定小螢幕(低dpi的圖片)的圖片的畫,
那麼Android 就會把大圖進行縮小,這個是可以的。匹配低密度的手機


如果一個圖片只有xhdpi的版本,那麼在小手機上面自動縮小,這個是不會影響效率
如果一張hdpi的圖片,執行在高密度的手機上面,例如xxxhdpi手機上面,那麼這張圖片就會自動的進行放大。就會失幀了。
因此建議準備多套圖片,適配各種密度,


---------------------------------------------------------------
---------------------------------------------------------------
那麼我們就是要先計算出mdpi的尺寸然後和美工要這幾個版本的。提供尺寸的大小。
或者直接要一個xxxhdpi的。


一般是要以xhdpi的圖片,以這個為基準去做要圖。
大圖往小圖縮小細節就沒有了。




如果設定ImageView 設定
width=100dp
height=100dp


在不同的手機和螢幕上面顯示所在螢幕的百分比不一樣


Android 尺寸適配+++++++++++++++++++++++++++++++++++++++
1:Android 控制元件,佈局對於尺寸,如果在佈局中固定設定xxxdp數值,在不同的手機上,雖然能夠縮放
但是和我們的預期的設定會有差別;
2:如果能夠使用wrap_content,match_parent,那麼儘量使用,這樣避免了實際的數字
3:儘量使用權重layout_weight,
4:如果需要使用固定的數值;那麼需要正對數值進行適配。那麼需要根據手機的螢幕尺寸,進行不同的適配將尺寸定義成一個資源。
讓android 系統,自己去進行不同的


android 空間必須是dp,字型必須是sp,因為這樣可以自動的適配


在尺寸資源100dp這裡alt+回車


在res 裡新建新的資源目錄
 選擇size
選擇small
最後創建出來一個values-small
然後依次建立normal,larget,xlarge




+++++++++++++++++++++++++++++++++++++++
Android 3.0以後覺得large這些劃分太麻煩了
Android
1:提出了根據螢幕尺寸進行適配的方式;
2:新的適配採用dp單位的寬高進行適配;
3:w<N>dp h<N>dp sw<N>dp 格式的修飾符,來適配螢幕的寬高,如果有一個w411dp資源,
當手機的螢幕小於這個尺寸的時候;411設定的是最低數值了,那麼手機依然會使用w411dp適配的資源


w:128dp 適配411dp資源
w:500dp 適配533 資源
-------------------------------------------
100dp                   411dp        533dp


+++++++++++++++++++++++++++++++++++++++++++++
關於w<數值>dp  h<數值>dp
+++++++++++++++++++++++++++++++++++++++++++++
切換螢幕的時候,要注意了
1:關於w,h修飾符,隨著裝置的旋轉,高度,寬度會交換,
這種情況下,將會影響適配情況。
2:通常如果只關注,最小寬度的情況
例如,給電視配置:
使用最短邊適配會更好;也就是sw<數值>dp
sw代表螢幕硬體上面短的邊的數值適配,就不會出現寬高交換的問題
也就是類似於values-sw600dp












最短邊,sw的應用:
根據實際的dp來進行
values 裡面出現了values-w820dp
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>




==============================================================
    //通過API獲取螢幕寬度,高度,dp數值
        WindowManager windowManager = getWindowManager();
        //獲取的顯示屏
        Display defaultDisplay = windowManager.getDefaultDisplay();
        //獲取螢幕的測量資訊,包括螢幕的寬高資訊;
        DisplayMetrics outMetrics = new DisplayMetrics();
        //還能獲取手機的dpi到底是多少,
        defaultDisplay.getMetrics(outMetrics);
        //手機DPI
        int densityDpi = outMetrics.densityDpi;
        //寬高的實際畫素
        int widthPixels = outMetrics.widthPixels;
        int heightPixels = outMetrics.heightPixels;


        //px=(dpi/150)*dp
        //scaledDensity=(dpi/150)
        float scaledDensity = outMetrics.scaledDensity;


        //寬度dp,高度dp
        float wDp = widthPixels / scaledDensity;
        float hDp = heightPixels / scaledDensity;


        Log.d("151226MY","densityDpi="+densityDpi);
        Log.d("151226MY","width="+widthPixels);
        Log.d("151226MY","height="+heightPixels);
        Log.d("151226MY","scaleDensity="+scaledDensity);
        Log.d("151226MY","wdp="+wDp);
        Log.d("151226MY","hDp="+hDp);
    }


12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: densityDpi=320
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: width=720
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: height=1280
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: scaleDensity=2.0
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: wdp=360.0
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: hDp=640.0


12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: densityDpi=240
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: width=480
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: height=800
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: scaleDensity=1.5
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: wdp=320.0
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: hDp=533.3333


d->density 密度


右鍵res 
目錄
ScreenWidth
輸入360
會得到values-w360dp的資料夾


新建strings


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="width_info">360</string>
</resources>




新建dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="new_image_size">120dp</dimen>
</resources>


+++++++++++++++++++++++++++++++++++++++++++
開發過程中是否用權重更多呢?
?????????????????????????
++++++++++++++++++++++++++++++++++++++++++++++
Android 版本的適配:
1:使用Android support 包,實現高版本API的相容;
ActionBar就是v7包的,Fragment 是v4包
2:通常由於採用一些新的API相容包,那麼軟體最低支援Android 2.1就是API7
3:確認軟體最低支援版本的時候,需要分析使用API最低支援到那個版本;


例如如果設定最低的版本是9
現在設定一個
Button btn=null;
btn.setX(34);


Develpe-》Reference-》API level




版本適配:
1:確定最低版本,不要呼叫最低版本以上的任何程式碼
2:如果呼叫的高版本方法,有對應的低版本的代替
例如View.setX()高版本,可以使用View.setLeft+View.setRight()這種低版本方法,代替
那麼就可以通過程式碼來進行倒臺的適配;
android.os.Build 這個類,就可以獲取當前手機的各種資訊,包括version
Button btn=null;
if(Build.VERSION.SDK_INT>=11){
btn.setX(34);
}else{
Toast.....("您的手機不支援。。。")
}




=========================================================================
硬體適配:
1:只有在清單檔案會有這個要求,應用市場裡裡面,我們的清單檔案會有作用的
應用市場軟體需要使用那些硬體,在清單檔案宣告;是否是必須的;


2:應用市場會根據手機的特性,顯示對應的軟體,根據清單檔案,過濾不支援的程式。
Trainning->Supporting Different Devices


<uses-feature android:name="android.hardware.camera" android:required="true"/>






Android 開發的
http://developer.android.com/guide/practices/screens_support.html
http://developer.android.com/design/style/devices-displays.html


螢幕適配,
先要了解什麼是dp,dpi,sp
dpi是dot per inch,每英寸多少個點。一英寸是多少呢?1英寸(in)=2.54釐米(cm),最簡單就是一寸照片的底部就是一寸長的。
  正常的USB的介面長度是13.4,也就是說usb介面長度大概略大於0.5英寸。
  紅米手機2的機身尺寸為134×67.2×9.4mm,長度為下部的寬度也就是2.6英寸,解析度為720x1280,按照這個說,dpi應該是300左右。 
 紅米手機的px 大概= dp*(320/160)=2dp.
而三星手機,480*640的解析度,下面大概是2.4英寸長度,那麼也就是說dpi應該是200左右。
三星手機的px 大概是dp*(200/160)=1.25dp.


px = dp * (dpi / 160)


The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen






Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.


A set of six generalized densities:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi