1. 程式人生 > >Android 不同解析度下螢幕適配的實戰方案與經驗總結

Android 不同解析度下螢幕適配的實戰方案與經驗總結

Android 開發中,螢幕適配是一大考點,幾乎每一場面試,都不會落下這個問題,這個問題說簡單也簡單,說難也難,當然對於有過真實的適配經驗的人來說,這個根本不算什麼問題,從坑裡爬過的人,自然知道這其中的水深水淺,哈哈。今天總結分享下自己在專案中關於螢幕適配的一些實戰經驗,作為自己從事Android開發以來的一篇溫故與告白!
方案一:使用多個values下的dimens.xml檔案來進行適配。
這裡寫圖片描述
看到了吧,平時我們專案的res目錄下一般只會有一個values目錄,這裡要講的適配不同螢幕的方案就是根據各個螢幕尺寸的螢幕分別建立對應的目錄和其中對應的dimens.xml檔案,每一個標準的“dp_”+“數字”在不同的deimens.xml檔案中指向的數字是不一樣的,比如

正常的values下的deimens.xml中dp_1的值

<dimen name="dp_1">1.0667dp</dimen>

而在values-sw1365dp目錄的deimens.xml檔案中dp_1的值則是

<dimen name="dp_1">3.7917dp</dimen>

呼叫也很簡單:

            <RelativeLayout
                android:layout_width="@dimen/dp_45"
                android:layout_height="@dimen
/dp_45"
android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true"/>

這就是這個方案能解決不同尺寸螢幕解析度下能夠自適應的原因。因為相同的一個dp數值,在不同的螢幕解析度中,真實賦值的dp數值是適合這個螢幕本身的。
這個方案的缺點就是前期麻煩一點,你需要下載這些不同螢幕對應的demens目錄和檔案到自己專案的res目錄下(

這裡附上下載這些資源的地址,點選可以跳轉下載),但優點就是後期用起來你會覺得很清爽方便。

方案二:使用線性佈局LinearLayout的weight屬性,這個是最最根本最直觀解決問題的方法。缺點是比較複雜有時會,當然,只有在比較複雜的佈局適配中才會選用它。比如看下面的一個例子該圖片來自這篇部落格,它裡面會講具體的佈局更清晰一點
這裡寫圖片描述
這個佈局裡面,如果你仔細看會發現,背景圖是單獨的一個imageview顯示一個大圖,手是單獨的一個imageview顯示一張大圖,而每一個手指上的指甲區域又是一個個單獨的imageview控制元件,再往下看,你會發現適配的難題來了,如何能保證這個手的圖片在不同的螢幕解析度顯示的時候,能保證它上面的五個指甲的位置剛好不錯位,如果錯了一點位置,就會露出染色指甲下面的肉色區域,會很明顯的被人看出來是個bug,寫死dp值肯定是不行的,用方案一解決的話也可以,但不夠科學,不夠放心,如果有一點點的小瑕疵,就會出大事情了。答案是這五個手指適配一張手的圖片,五個手指和手的圖片都需要用weight屬性控制適配。而他們用來匹配分割的物件都是整個螢幕,這樣才絕對公平,不會有錯誤。
也就是說,每一個手指甲imageview和放手的圖片的imageview控制元件都單獨放在了各自對應的一個兩層巢狀的線性佈局中,對寬和高都根據螢幕做了weight屬性,這樣就保證了不論什麼解析度下的螢幕下他們都是按照能夠完全吻合的比例顯示的,也就不會出現錯誤的現象。
程式碼舉例如下:

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="@dimen/dp_10">

             <!--背景圖片做螢幕自適應處理-->
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <!--先確定在螢幕中橫向的均分比重-->
                <View
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="5"
                    android:orientation="vertical">
                    <!--再確定在螢幕中縱向的均分比重-->
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="1"/>

                    <ImageView
                        android:id="@+id/iv_zodiac_bg"
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="5" 
                        android:src="@drawable/pic_bg_zodiac" />

                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight="1"/>

                </LinearLayout>

                <View
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            </LinearLayout>

            ...  此處省略其餘控制元件的具體的適配程式碼

 </RelativeLayout>

這樣最後就確認了一個佈局或者控制元件在不同螢幕不通解析度中,顯示的位置和比重都是一樣的,也就不會發生錯位的現象。

以上是我個人總結的關於Android螢幕自適應方面的一些經驗,如果您看出來有不規範或者有遺漏或者錯誤的地方,歡迎在部落格底部留言指正,如果有興趣的也可以留言一起深度討論探究,寫部落格的目的本身就是為了提升自己嘛,哈哈!