Android 支持多屏幕机制
2011年07月22日
[b]转载自wjmming:http://wjmming.iteye.com/blog/789813[/b]
[b]
[/b]
[b][/b]
[b]术语[/b]
1.Screen size 屏幕实际尺寸。
Android讲屏幕实际尺寸分为3个通用的尺寸。
2.Aspect ratio 长宽比
3.Resolution 分辨率
4.Density 密度
5.Density-independent pixel 密度无关的像素
介绍:Adnroid1.6或以上SDK,在AndroidManifest.xml中提供新的一个元素用于支持多屏幕机制。
[b]Android提供3种方式处理屏幕自适应[/b]
[b]一.预缩放的资源 ( 基于尺寸和密度去寻找图片,其实就是找res文件夹下的资源 )[/b]
1.如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2.如果找到相应的尺寸,但是找不到密度,则尝试找该尺寸下其他密度资源进行缩放(从高到低)。
3.如果没法找到相应的尺寸,则忽略所有包含尺寸目录,直接找只包含密度目录。
如果找到匹配密度,资源缩放则利用这些图片进行无缩放显示。
4.如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
5.如果"medium" (160)没有资源,则再到其他密度资源包中找,并缩放显示(从高到低)。
[b]二.自动缩放的像素尺寸和坐标(密度兼容)[/b]
1.如果应用程序不支持不同密度android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。
2.对于预缩放的资源,当android:anyDensity="false",系统还是会尝试去匹配尺寸和密度。
1>.如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2>.如果找到相应的尺寸,但是找不到密度,则尝试找该尺寸下其他密度资源进行缩放(从高到低)。
3>.如果没法找到相应的尺寸,则忽略所有包含尺寸目录,直接找只包含密度目录。
如果找到匹配密度,资源缩放则利用这些图片进行无缩放显示。
4>.如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
5>.如果"medium" (160)没有资源,则再到其他密度资源包中找,并缩放显示(从高到低)。
3.android:anyDensity="false",只对密度兼容起作用,尺寸兼容没效果
自己加上
4.关于取图片宽度和高度问题。
1>.符合屏幕dpi的图片,通过Bitmap类取高度和宽度数值时,数值跟图片原本大小一样。
2>.符合屏幕dpi的图片,通过Drawable类取Intrinisc高度和宽度数值时,数值大小会根据BitmapScale / TargetDensityScale比值变化。
3>.不符合屏幕dpi的图片,通过Bitmap类取高度和宽度数值时,数值是系统缩放后的数字。
4>.不符合屏幕dpi的图片,通过Drawable类取Intrinisc高度和宽度数值时,数值大小会根据BitmapScale / TargetDensityScale比值变化。
[b] 注明:BitScale = 图片dpi实际密度,TargetDensityScale = 屏幕实际密度。[/b]
[b]三.兼容模式显示在大屏幕,尺寸(尺寸兼容)[/b]
1.对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为 ("normal")和密度为("medium)显示,不过会出现一层黑色的背景。不是居中显示。
[b]密度独立:[/b]
系统默认应用支持DIP单位的,三个使用DIP的地方:
1.加载资源时,使用DIP实现预缩放的资源。
2.在Layout使用DIP,系统自动完成缩放。
3.在应用程序中,自动缩放一些绝对像素。
(只有在android:anyDensity="false"生效)即屏幕自适应方式二
4.像素单位都使用DIP,文本单位使用SP
[b]最佳屏幕独立实践:[/b]
1.使用wrap_content, fill_parent 和使用dip作为像素单位in XML layout files。
2.避免使用AbsoluteLayout
3.在代码中,不要使用像素数字硬编码,而是要通过dip转换为px。
例子:
你使用手势分析器分析一个scroll手势,假如,你滚动的距离是16px。an inch = 2.54 cm
1.在一个160dip的屏幕中,你实际移动距离 16px / 160dpi = 1/10th of an inch (or 2.5 mm)
2.在一个240dip的屏幕中,你实际移动距离 16px / 240dpi = 1/15th of an inch (or 1.7 mm)
// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;
// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale);
4.使用密度和/或尺寸特定资源(通过文件夹)
关于预缩放或者自动缩放图片或9格图
1.系统是一定对会资源包下的图片进行合理的缩放。
例如:一张240x240高密度图片,显示在中密度的屏幕上,图片大小自动变为160x160。
2.如果你不想系统自动帮你缩放图片,可以建立一个res/drawable-nodpi文件夹,存放你的图片。
3.也可以通过BitmapFactory.Options 设置完成你想要的图片缩放等效果或9格图(在画图时)。
4.自动缩放图片比预缩放花费更多CPU。
2011年07月22日
[b]转载自wjmming:http://wjmming.iteye.com/blog/789813[/b]
[b]
[/b]
[b][/b]
[b]术语[/b]
1.Screen size 屏幕实际尺寸。
Android讲屏幕实际尺寸分为3个通用的尺寸。
2.Aspect ratio 长宽比
3.Resolution 分辨率
4.Density 密度
5.Density-independent pixel 密度无关的像素
介绍:Adnroid1.6或以上SDK,在AndroidManifest.xml中提供新的一个元素用于支持多屏幕机制。
[b]Android提供3种方式处理屏幕自适应[/b]
[b]一.预缩放的资源 ( 基于尺寸和密度去寻找图片,其实就是找res文件夹下的资源 )[/b]
1.如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2.如果找到相应的尺寸,但是找不到密度,则尝试找该尺寸下其他密度资源进行缩放(从高到低)。
3.如果没法找到相应的尺寸,则忽略所有包含尺寸目录,直接找只包含密度目录。
如果找到匹配密度,资源缩放则利用这些图片进行无缩放显示。
4.如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
5.如果"medium" (160)没有资源,则再到其他密度资源包中找,并缩放显示(从高到低)。
[b]二.自动缩放的像素尺寸和坐标(密度兼容)[/b]
1.如果应用程序不支持不同密度android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。
2.对于预缩放的资源,当android:anyDensity="false",系统还是会尝试去匹配尺寸和密度。
1>.如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2>.如果找到相应的尺寸,但是找不到密度,则尝试找该尺寸下其他密度资源进行缩放(从高到低)。
3>.如果没法找到相应的尺寸,则忽略所有包含尺寸目录,直接找只包含密度目录。
如果找到匹配密度,资源缩放则利用这些图片进行无缩放显示。
4>.如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
5>.如果"medium" (160)没有资源,则再到其他密度资源包中找,并缩放显示(从高到低)。
3.android:anyDensity="false",只对密度兼容起作用,尺寸兼容没效果
自己加上
4.关于取图片宽度和高度问题。
1>.符合屏幕dpi的图片,通过Bitmap类取高度和宽度数值时,数值跟图片原本大小一样。
2>.符合屏幕dpi的图片,通过Drawable类取Intrinisc高度和宽度数值时,数值大小会根据BitmapScale / TargetDensityScale比值变化。
3>.不符合屏幕dpi的图片,通过Bitmap类取高度和宽度数值时,数值是系统缩放后的数字。
4>.不符合屏幕dpi的图片,通过Drawable类取Intrinisc高度和宽度数值时,数值大小会根据BitmapScale / TargetDensityScale比值变化。
[b] 注明:BitScale = 图片dpi实际密度,TargetDensityScale = 屏幕实际密度。[/b]
[b]三.兼容模式显示在大屏幕,尺寸(尺寸兼容)[/b]
1.对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为 ("normal")和密度为("medium)显示,不过会出现一层黑色的背景。不是居中显示。
[b]密度独立:[/b]
系统默认应用支持DIP单位的,三个使用DIP的地方:
1.加载资源时,使用DIP实现预缩放的资源。
2.在Layout使用DIP,系统自动完成缩放。
3.在应用程序中,自动缩放一些绝对像素。
(只有在android:anyDensity="false"生效)即屏幕自适应方式二
4.像素单位都使用DIP,文本单位使用SP
[b]最佳屏幕独立实践:[/b]
1.使用wrap_content, fill_parent 和使用dip作为像素单位in XML layout files。
2.避免使用AbsoluteLayout
3.在代码中,不要使用像素数字硬编码,而是要通过dip转换为px。
例子:
你使用手势分析器分析一个scroll手势,假如,你滚动的距离是16px。an inch = 2.54 cm
1.在一个160dip的屏幕中,你实际移动距离 16px / 160dpi = 1/10th of an inch (or 2.5 mm)
2.在一个240dip的屏幕中,你实际移动距离 16px / 240dpi = 1/15th of an inch (or 1.7 mm)
// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;
// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale);
4.使用密度和/或尺寸特定资源(通过文件夹)
关于预缩放或者自动缩放图片或9格图
1.系统是一定对会资源包下的图片进行合理的缩放。
例如:一张240x240高密度图片,显示在中密度的屏幕上,图片大小自动变为160x160。
2.如果你不想系统自动帮你缩放图片,可以建立一个res/drawable-nodpi文件夹,存放你的图片。
3.也可以通过BitmapFactory.Options 设置完成你想要的图片缩放等效果或9格图(在画图时)。
4.自动缩放图片比预缩放花费更多CPU。