Andoird屏幕适配
1、基本概念
1、屏幕尺寸:按屏幕对角测量的实际物理尺寸。Android将所有实际屏幕尺寸分组为四种通用尺寸:小、正常、大和超大。从Android 3.2(API 级别 13)开始,这些尺寸组已弃用,而采用根据可用屏幕宽度管理屏幕尺寸的新技术。
2、屏幕密度:屏幕物理区域中的像素量;通常称为 dpi(每英寸点数)。Android 将所有屏幕密度分组为六种通用密度:低、中、高、超高、超超高和超超超高。
ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi
3、每种通用的尺寸和密度都涵盖一个实际屏幕尺寸和密度范围。
4、分辨率:屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕尺寸及密度。
5、密度无关像素 (dp):是虚拟像素单位,在定义应用的UI时应始终使用dp单位,以确保在不同密度的屏幕上正常显示UI。密度无关像素等于160dpi屏幕上的一个物理像素。dp单位转换为屏幕像素px的公式: px = dp * (dpi / 160)。例如,在 240 dpi屏幕上,1 dp 等于1.5物理像素。
6、为什么使用dp来代替px布局?
使用像素来定义布局尺寸会带来问题,因为不同的屏幕具有不同的像素密度,因此同样数量的像素在不同设备上可能对应于不同的物理尺寸。因此,在指定尺寸时,请务必使用 dp 或 sp 单位。dp 是一种密度无关像素,对应于 160 dpi 下像素的物理尺寸。 sp 是相同的基本单位,但它会按用户首选的文本尺寸进行缩放(属于缩放无关像素),因此您在定义文本尺寸时应使用此计量单位(但切勿为布局尺寸使用该单位)。
2、密度独立性
密度独立性:应用界面元素的物理尺寸不会因为不同设备的像素密度而显著变化。
Android 系统可帮助您的应用以两种方式实现密度独立性:
1、系统根据当前屏幕密度扩展 dp 单位数:由于密度独立像素的基线是中密度屏幕,因此对于中密度屏幕的设备不会改变dp,而对于低密度和高密度屏幕,系统将分别增加和减少密度独立像素值,以适应屏幕。
2、系统在必要时可根据当前屏幕密度将可绘制对象资源扩展到适当的大小,但位图缩放可能导致模糊或像素化位图,因此应为不同的密度提供替代的位图资源。例如,应为高密度屏幕提供分辨率较高的位图。
3、屏幕适配
1、在 XML 布局文件中指定尺寸时使用wrap_content、match_parent 或 dp 单位。
2、不要在应用代码中使用硬编码的像素值
Android系统使用像素作为表示尺寸或坐标值的标准单位。例如 myView.getWidth() 将返回视图在当前屏幕的像素宽,但在更高密度的屏幕上,返回的值可能不同。
程序中可以用getResources().getDisplayMetrics().density来获得屏幕密度,从而完成dp和px的相互转换。
3、不要使用 AbsoluteLayout(已弃用)
AbsoluteLayout 会强制在固定位置放置其子视图,很容易导致在不同显示屏上显示效果不好的用户界面。因此,AbsoluteLayout在Android 1.5(API 级别 3)上便已弃用。
4、使用尺寸和密度特定资源,为不同屏幕密度提供替代位图可绘制对象
4、配置限定符
要使用配置限定符:
1、在项目的 res/ 目录中新建一个目录,并使用以下 格式命名:<resources_name>-<qualifier>
其中,<resources_name> 是标准资源名称(例如drawable 或 layout);<qualifier> 是配置限定符,用于指定要使用这些资源的屏幕配置(例如 hdpi 或 xlarge)。
您可以一次使用多个 <qualifier> —只需使用短划线分隔每个限定符。
2、将适当的配置特定资源保存在此新目录下。这些资源 文件的名称必须与默认资源文件完全一样。
5、为不同屏幕尺寸提供不同的布局
可用于提供尺寸特定资源的配置限定符包括 small、normal、large 和 xlarge。在 Android 3.2 中引入了屏幕尺寸的新配置限定符:smallestWidth sw<N>dp、可用屏幕宽度w<N>dp、可用屏幕高度h<N>dp。例如:
res/layout/my_layout.xml // layout for normal screen size("default")
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscapeorientation
6、为不同屏幕密度提供不同的位图可绘制对象
可用于密度特定资源的配置限定符(在下面详述)包括 ldpi(低)、mdpi(中)、 hdpi(高)、xhdpi(超高)、xxhdpi (超超高)和 xxxhdpi(超超超高)。例如:
res/drawable-mdpi/graphic.png // bitmap for medium-density
res/drawable-hdpi/graphic.png // bitmap for high-density
res/drawable-xhdpi/graphic.png // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png // bitmap for extra-extra-high-density
要为不同的密度创建替代位图可绘制对象,应遵循六种通用密度之间的 3:4:6:8:12:16 缩放比率。
7、其他
1、要声明应用支持的屏幕尺寸,应在清单文件中包含 <supports-screens> 元素。
2、缩放运行时创建的位图对象
要控制是否缩放运行时创建的 Bitmap,可以使用setDensity()指定位图的密度,从DisplayMetrics传递密度常量,例如DENSITY_HIGH或DENSITY_LOW。如果使用BitmapFactory创建Bitmap,例如从文件或流创建,可以使用 BitmapFactory.Options 定义位图的属性(因为它已经存在),确定系统是否要缩放或者如何缩放。