参考文章
https://www.jianshu.com/p/1302ad5a4b04
http://www.cocoachina.com/android/20151030/13971.html
https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA
什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
- 屏幕尺寸
屏幕尺寸指屏幕的对角线的长度
单位是英寸,1英寸=2.54厘米 - 屏幕分辨率
屏幕分辨率指在横纵向上的像素点数
单位是px,1px=1个像素点
一般以纵像素橫像素,如19201080 - 屏幕像素密度
屏幕像素密度是指每英寸上的像素点数
单位是dpi,即“dot per inch”的缩写
屏幕像素密度与屏幕尺寸和屏幕分辨率有关
什么是dp、dip、dpi、sp、px?之间的关系是什么?
- px构成图像的最小单位
- dp、dip,Density Independent Pixels的缩写,即密度无关像素,以160dpi为基准,1dip=1px
Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
- sp即Scale-Independent Pixels可以根据文字大小首选项进行缩放(12sp,14sp,18sp,22sp)
什么是mdpi、hdpi、xdpi、xxdpi?如何计算区分?
名称 | 像素密度范围 |
---|---|
mdpi | 120dpi~160dpi |
hdpi | 160dpi~240dpi |
xhdpi | 240dpi~320dpi |
xxhdpi | 320dpi~480dpi |
xxxhdpi(2k屏幕) | 480dpi~640dpi |
支持各种屏幕尺寸
Weight
计算出的宽度= 原来的宽度+剩余空间所占百分比的宽度
屏幕宽度 L
Button1
2/3L = L +(L-2L)1/3 = L-1/3L=2/3L
0dp
1/3L = 0 +L1/3 = 1/3L
Button2
1/3L = L+(L-2L)*2/3 = L-2/3L= 1/3L尺寸限定符
res/layout/main.xml 单面板
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />
</LinearLayout>
res/layout-large/main.xml 双面板
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />
</LinearLayout>
- 屏幕宽度限定符
res/layout/main.xml,单面板(默认)布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />
</LinearLayout>
res/layout-sw600dp/main.xml,双面板布局: Small Width 最小宽度
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />
</LinearLayout>
- 使用布局别名
res/layout/main.xml: 单面板布局
res/layout-large/main.xml: 多面板布局(3.2之前)
res/layout-sw600dp/main.xml: 多面板布局(3.2之后)
res/layout/main.xml 单面板布局
res/layout/main_twopanes.xml 双面板布局(抽取出相同部分进行统一管理)
setContentView(R.layout.main);
默认布局
res/values/layout.xml:
<resources>
<item name="main" type="layout">@layout/main</item>
</resources>
Android3.2之前的平板布局
res/values-large/layout.xml:
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
Android3.2之后的平板布局
res/values-sw600dp/layout.xml:
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
- 屏幕方向限定符
res/values-sw600dp-land/layouts.xml:
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
res/values-sw600dp-port/layouts.xml:
<resources>
<item name="main" type="layout">@layout/main</item>
</resources>