Android屏幕适配出现的原因
为什么Android需要进行屏幕适配?
由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子,但是这种“碎片化”到底到达什么程度呢?
统计数据表明:
2012年,支持Android的设备共有3997种;
2013年,支持Android的设备共有11868种;
2014年,支持Android的设备共有18796种;
2015年,支持Android的设备共有24093种;
试想一下这么一个场景:
为5.5寸屏幕准备的UI设计图,运行在6.6寸的屏幕上,很可能在右侧和下侧存在大量的空白;
而6.6寸的UI设计图运行到5.5寸的设备上,很可能显示不下。
屏幕种类这么多,那么就需要一套完美的方案去解决适配问题,介绍屏幕适配方案之前,下面先简单介绍下Android屏幕中用到的一些相关概念
屏幕基本概念
屏幕尺寸
屏幕尺寸即手机屏幕对角线的物理尺寸,以英寸为单位,1英寸=2.54厘米;
现常见的屏幕尺寸:5.5、6.0、6.1、6.5、6.6、6.67、6.7英寸等等
屏幕分辨率和像素
屏幕分辨率就是手机屏幕的像素点数,指屏幕横竖各有多少个像素,一般描述成屏幕的“高×宽”,如下方所示屏幕分辨率就是所谓的 1080x2400 ;
屏幕像素即 1080x2400=2592000,分辨率为 1080x2400 的手机约有260w个像素;
现Android手机比较常见的分辨率为:1080x1920、1080x2400、1440x3200;
adb命令查看手机屏幕分辨率:adb shell wm size
sp
sp:根据文字大小首选项进行放缩,主要用于字体显示;谷歌开发指导中推荐使用12sp以上的字体,否则用户将无法看清。设置字体大小时不要使用奇数或小数,可能会造成精度丢失;
px
px:像素点,构成图像的最小单位
dp 密度无关像素
dp:安卓中的相对大小,dp就是为了使得开发者设置的长度能够根据不同屏幕的分辨率获得不同的像素(px)数量;
换算公式是 1dp=(dpi/160)x 1px;(例:在密度为160dpi的屏幕上,1px就是1dp。依次类推,在320dpi的屏幕上,1dp就是2px。屏幕密度越大,1个dp对应的px也就越大);
dpi
dpi:指每英寸的像素点数,用于描述屏幕的显示特性,dpi越大,屏幕的精细度越高,屏幕看起来就越清晰;
adb命令查看手机屏幕密度:adb shell wm density
密度类型 分辨率 dpi dp换算
低密度(ldpi) 240x320 120 1dp=0.75px
中密度(mdpi) 320x480 160 1dp=1px
高密度(hdpi) 480x800 240 1dp=1.5px
超高密度(xhdpi) 720x1280 320 1dp=2px
超超高密度(xxhdpi) 1080x1920 480 1dp= 3px
Density
Density:表示设备屏幕密度的值,它表示每英寸在屏幕上显示的像素数量,density和dpi的关系为 density = dpi/160;
屏幕方向
横屏竖屏自动切换
在res目录下建立 layout 和 layout-land 两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换;
禁用自动切换屏幕方向
// 限制此页面横屏显示 Android:screenOrientation="landscape" // 限制此页面竖屏显示 Android:screenOrientation="portrait"
Android屏幕自适应
1. dp原生方案
Android尺寸的基本单位,Android自带的原始的适配方案, 在不同的分辨率手机里面表现出相应大小的像素点。 在不同的分辨率的手机里面1dp对应着不同的px, 这样就实现了dp定义一个控件大小的时候,在不同分辨率手机里表现出相应大小的像素值;
2. 线形布局权重
(layout_weight属性值越小 对应的优先级越高)
在 values 文件夹下的 styles 文件中新建一个 style 属性标签;
布局文件中有需要引用即可(省去标签中的 android:layout_height=“0px” 属性);
示例代码
styles.xml 文件
<!<!--styles.xml--> <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 全屏幕拉伸--> <style name="layout_full"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> </style> <!-- 固定自身大小--> <style name="layout_wrap"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style> <!-- 横向分布--> <style name="layout_horizontal" parent="layout_full"> <item name="android:layout_width">0px</item> </style> <!-- 纵向分布--> <style name="layout_vertical" parent="layout_full"> <item name="android:layout_height">0px</item> </style> </resources>
activity_main.xml 文件
<!--activity_main.xml--> <LinearLayout style="@style/layout_vertical" android:layout_weight="2" android:orientation="vertical"> <View style="@style/layout_vertical" android:background="#ffffff" android:layout_weight="2"/> <View style="@style/layout_vertical" android:background="#000000" android:layout_weight="6"/> <View style="@style/layout_vertical" android:background="#ff0000" android:layout_weight="9"/> <View style="@style/layout_vertical" android:background="#00ffff" android:layout_weight="1"/> </LinearLayout>
Android屏幕自适应2:https://developer.aliyun.com/article/1473629