前提:之前公司裡面做的是電視應用,從來沒有遇到過螢幕適配問題,這幾天,公司新拿了乙個盒子,每個控制項尺寸變大,出現了很大的適配問題,所以我們就著手解決android螢幕適配的問題。
在做適配前,必須要了解一下螢幕密度dpi(dots per inch),螢幕密度就是每英吋有多少個顯示點,可以通過如下的方式獲取到:
displaymetrics metric = new displaymetrics();
metric = getresources().getdisplaymetrics();
int width = metric.widthpixels; // 螢幕寬度(畫素)
int height = metric.heightpixels; // 螢幕高度(畫素)
float density = metric.density; // 螢幕密度(0.75 / 1.0 / 1.5 / 2.0)
int densitydpi = metric.densitydpi; // 螢幕密度dpi(120 / 160 / 240/ 360)
log.i("dpiiswhat", " width=" + width + " height=" + height
+ " densiy=" + density + " densitydpi=" + densitydpi);
注意:通過上面方法得到的長度和寬度兩個中有乙個有時候不準確(這主要是因為硬體廠家的問題),我們要進行一下檢視,這樣上下對比,來估算出正確的長度或者寬度。`就比如,我現在測試的乙個裝置,他的寬度和高度分別是1280*692,那麼這個時候,就應該對比下面的數值,得到該裝置真正的寬度和高度為1280*720
/** 市場上普通螢幕寬度 */
private
static
final
int screenwidth = ;
/** 市場上普通螢幕高度 */
private
static
final
int screenheight = ;
在螢幕密度dpi為160dpi的時候,螢幕密度比為1.0,1px=1*dp;
在螢幕密度dpi為320dpi的時候,螢幕密度比為2.0,1px=2*dp;
那麼,當有乙個新的android裝置,他的螢幕密度比為2.0時,同樣的50dp寬度,在2.0上面就顯示的是100px,所以就會超出螢幕,出現適配問題。
以下的乙個xml檔案
""
xmlns:tools=""
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingbottom="@dimen/activity_vertical_margin"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
tools:context="com.example.textdemo.mainactivity"
android:orientation="horizontal" >
"@+id/tv1"
android:layout_width="@dimen/m180"
android:layout_height="@dimen/m180"
android:background="@android:color/holo_blue_bright"
android:textsize="@dimen/text_s26" />
"@+id/tv2"
android:layout_width="@dimen/m180"
android:layout_height="@dimen/m180"
android:layout_marginleft="@dimen/m60"
android:background="@android:color/holo_blue_bright"
android:textsize="@dimen/text_s26" />
注意:可以先無視textview上的文字
顯示到480*800,dpi為1.0的裝置上,如下圖所示:
注意:可以先無視textview上的文字
顯示到720*1280,dpi為2.0的裝置上,如下圖所示:
我們看到同一套xml檔案在不同裝置上,有著不同的顯示效果,這是不被允許出現的。
為了解決這個適配問題,我在工程中新建了如下所示的檔案,
分別是values-sw360dp和values-sw480dp。那麼這個又是什麼東西呢。
values-sw360dp顯示的資料是螢幕解析度長和寬中最小的那個,大於等於360dp的。sw代表small width。
所以720*1280,dpi為2.0的裝置,(長度和寬度最小的是720px,除以1.0,就是360dp。)就會先去values-sw360dp尋找是否有合適的dimens。
所以480*800,dpi為1.0的裝置,(長度和寬度最小的是480px,除以1.0,就是480dp。)就會先去values-sw480dp尋找是否有合適的dimens。
注意:如果這時,沒有values-sw480dp.就會向下繼續尋找到values-sw360dp,如果還沒有,則會進入預設的values
我們現在以dpi為1.0的裝置為基礎,將dpi為2.0的裝置適配正確。
可以看到,dpi為2.0的裝置,控制項長寬變寬,我們要讓其變小一些,除以某個數值,那麼怎麼算出這個數值呢,我下面將進行乙個舉例。
簡單解釋一下上面的圖的內容,android裝置,展示到介面的控制項,最終都是以px為單位的,為了讓肉眼看起來,ui效果一樣,在480px裝置上有乙個佔滿螢幕的紅色框,那麼在720px的裝置上,就得是720px的長度的紅色框,所以就要修改dimens下的數值。
由上圖可知,將values/dimens.xml下面的所有單位除以1.3就可以得到最新數值,放入valuese-sw360dp/dimens.xml中。
所以,values-sw480dp/dimens下的內容如下所示:
name="m180">180dpdimen>
name="m60">60dpdimen>
name="text_s26">26spdimen>
resources>
values-sw360dp/dimens下的內容如下所示:
name="m180">138dpdimen>
name="m60">46dpdimen>
name="text_s26">20spdimen>
resources>
mainactivity裡的**如下所示:
package com.example.textdemo;
import android.os.bundle;
import android.util.displaymetrics;
import android.util.log;
import android.widget.textview;
public
class
mainactivity
extends
activity
}
通過getresources().getdimension(r.dimen.text_s26)得到的值,是dimens下的值乘以螢幕密度比。
官方文件是這樣寫的:
the current displaymetrics associated with
the resources.
所以獲取乙個具體的值,就應該這樣寫:
int dp = (int) (getresources().getdimension(r.dimen
.test) / getresources().getdisplaymetrics().density)
這也就是上面的,textview裡面的文字內容了。 關於 android螢幕適配
一 關於布局適配 1 不要使用絕對布局 2 盡量使用match parent 而不是fill parent 3 能夠使用權重的地方盡量使用權重 android layout weight 4 如果是純色背景,盡量使用 android 的shape 自定義。5 如果需要在特定解析度下適配,可以在 re...
關於android螢幕適配的問題
px pixels 畫素 對應螢幕上的實際畫素點。dip device independent pixels,與密度無關的畫素,基於螢幕密度的抽象單位。在每英吋160點的顯示器上,1dp 1px 即1 1關係。dp 就是 dip sp scaled pixels 放大畫素 與密度和字型縮放度無關的畫...
關於Android螢幕適配的問題
android由於螢幕裝置的種類多種多樣,不像ios那邊只需要適配幾種型號的機器即可。對於螢幕的適配,特別是針對於既有ios 又需要有android的移動應用開發來說,適配更是存在著問題。在此,可以利用一種簡單的解決方案來簡化問題,達到pad和phone手機的簡單適配的效果。可根據displayme...