Android屏幕適配
(更新2016-06-20)結合:Android開發:最全面、最易懂的Android屏幕適配解決方案
1. 基礎知識
- 補充一些常識,便于更好理解
1.1 屏幕大小
- 含義:指屏幕對象線的長度
- 單位:英寸(inch),1英寸=2.54cm
通常用“寸”來度量,例如4.7寸手機,5.5寸手機
1.2 分辨率
- 含義:手機橫向和縱向的像素點之和
例:720×1280,表示物理屏幕區域內像素點的總和。其中橫向有720個像素點,縱向有1280個像素點
(切記:跟屏幕適配沒有任何關系),因為我們既可以把720×1280的分辨率做到4.0英寸的手機上,也可以把720×1280的分辨率做到5.0英寸的手機上,如果分辨率相同,手機屏幕越小越清晰
- 單位: px(pixel像素)
像素,就是屏幕中最小的一個顯示單元
1px = 1像素點
1.3 屏幕像素密度
- 含義:每英寸屏幕所擁有的像素數,像素謎底越大,顯示畫面細節就越豐富
- 單位:dpi(dots per ich)
- 計算公式:像素密度=√{(長度像素數2+寬度像素數2)}/ 屏幕尺寸(對角線像素點數除以屏幕大小)
假設設備內每英寸有160個像素,那么該設備的屏幕像素密度=160dpi
- 常見手機屏幕像素及對應分辨率級別
密度類型 | 代表的分辨率(px) | 屏幕像素密度(dpi) |
---|---|---|
低密度(ldpi) | 240*320 | 120 |
中密度(mdpi) | 320*480 | 160 |
高密度(hdpi) | 480*800 | 240 |
超高密度(xhdpi) | 720*1280 | 320 |
超超高密度(xxhdpi) | 1080*1920 | 480 |
1.4 獨立像素密度 dp/dip
- 含義:density-independent pixel,叫dp或dip,與終端上的實際物理像素點無關
- 單位:dp,保證在不同屏幕像素密度的設備上換算后顯示同樣效果
- dp和px之間的簡單換算關系
密度類型 | 代表的分辨率(px) | 屏幕像素密度(dpi) | 換算關系 | 比例 |
---|---|---|---|---|
低密度(ldpi) | 240*320 | 120 | 1dp=0.75px | 3 |
中密度(mdpi) | 320*480 | 160 | 1dp=1.0px | 4 |
高密度(hdpi) | 480*800 | 240 | 1dp=1.5px | 6 |
超高密度(xhdpi) | 720*1280 | 320 | 1dp=2.0px | 8 |
超超高密度(xxhdpi) | 1080*1920 | 480 | 1dp=3.0px | 12 |
1.4 獨立比例像素
- 含義:scale-independent pixel,叫sp或sip
- 單位:sp
- 文字版dp
- 推薦使用12sp、14sp、18sp、22sp作為字體設置的大小,不推薦使用奇數和小數,容易造成精度的丟失問題;小于12sp的字體會太小導致用戶看不清
2. 適配方式
- 一般分為圖片適配、布局適配、尺寸適配、權重適配和代碼適配
- 一般良好的開發習慣就不會出現太多適配問題
- 多用dp,sp,不用px
- 多用線性布局和相對布局,不用絕對布局
2.1 dimens適配
- 在res中新建對應values的values-1280 * 720
- 在values-1280*720中創建一個對應的dimens文件
2.2 Layout適配
- 在res中新建對應layout的layout-1280 * 720
- 在layout-1280*720中創建一個對應的dimens文件
2.3 java代碼適配
-
通過Java代碼控制,讓TextView控件的寬高分別為屏幕的寬和高的一半
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <!-- 當前控件寬高為屏幕寬度的各 50% --> <TextView android:id="@+id/tv" android:background="#000000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
-
MainActivity中完成Java代碼控制TextView布局效果
public class MainActivity extends Activity { private static final String tag = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去掉 title requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //獲取 TextView 控件 TextView tv = (TextView) findViewById(R.id.tv); //找到當前控件的父控件(父控件上給當前的子控件去設定一個規則) DisplayMetrics metrics = new DisplayMetrics(); //給當前 metrics 去設置當前屏幕信息(寬(像素)高(像素)) getWindowManager().getDefaultDisplay().getMetrics(metrics); //獲取屏幕的高度和寬度 Constant.srceenHeight = metrics.heightPixels; Constant.srceenWidth = metrics.widthPixels; //日志輸出屏幕的高度和寬度 Log.i(tag, "Constant.srceenHeight = "+Constant.srceenHeight); Log.i(tag, "Constant.srceenWidth = "+Constant.srceenWidth); //寬高各 50% RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( //數學角度上 四舍五入 (int)(Constant.srceenWidth*0.5+0.5), (int)(Constant.srceenHeight*0.5+0.5)); //給 tv 控件設置布局參數 tv.setLayoutParams(layoutParams); } } public class Constant { public static int srceenHeight; public static int srceenWidth; }
2.4 weight權重適配
- 使用權重的規則
- 只能用在線性控件中,比如LinearLayout
- 豎直方向上使用權重的控件高度必須為0dp
- 水平方向上使用權重的控件寬度必須為0dp