關於Android螢幕適配應該知道的一些知識

2021-07-16 23:53:31 字數 4479 閱讀 8871

前提:之前公司裡面做的是電視應用,從來沒有遇到過螢幕適配問題,這幾天,公司新拿了乙個盒子,每個控制項尺寸變大,出現了很大的適配問題,所以我們就著手解決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...