Android屏幕屏幕适配小结,单位换算/屏幕信息/屏幕坐标/状态栏/点九图使用和制作
2015-03-26 00:11
666 查看
比起IOS开发总共不过区区几种设备型号,作为Android开发者,面对成千上万的机型,屏幕适配的工作就显得尤为重要。
官方中关于屏幕适配的几点建议:
拉伸和压缩你的布局,以适应各种不同的高度和宽度。
在更大的设备上,可以利用额外的屏幕。结合多个视图 创建复合控件来显示更多内容和轻松导航。
为不同的屏幕密度(DPI)设备提供多套资源,以确保应用程序在任何设备上看起来不错。
dpi 是Dots Per Inch的缩写, 每英寸点数,即每英寸包含像素个数。比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。手机dpi越大也就是俗称分辨率也高。
dp 也即dip,设备独立像素,device independent pixels的缩写,Android特有的单位,在屏幕密度dpi = 160屏幕上,1dp = 1px。android为了支持LDPI (120dpi), MDPI (160dpi), HDPI(240dpi),
XHDPI (320dpi), and XXHDPI(480dpi) 使用这个,而不依赖像素单位。在定义布局width/height值,推荐使用dp作单位。 dx和dp的换算:dx=dp*density
sp scaled pixels(比例放大像素). 主要用于字体显示best for textsize,sp是为了保证相同字号的字在不同PPI屏幕上显示的物理高度一致。
view.getLocationOnScreen(pos); // 获取在当前窗口内的绝对坐标
view.getLocationInWindow(pos); // 得到view在整个屏幕内上的位置
注意:该方法在oncreate中执行返回值为(0,0),因为该控件还未在activity中生成,建议在 onWindowFocusChanged(boolean hasFocus) 方法中调用
popupWindow的高度= 屏幕高度- 状态栏高度
虚拟按键的情况,针对一些特殊型号的手机,如魅族系列等在屏幕底部时手机的虚拟按键,此时就有必要针对此类型号手机计算虚拟按键的位置或高度,全屏PopupWindow需要设置popupWindow的高度= 屏幕高度- 状态栏高度-底部虚拟键盘高度。
如果该方法获取值0,解决办法可以参看我的另外一篇文章获取android顶部状态栏高度的两种方式
.9.png真可谓是解决屏幕适配的利器,可惜公司美工只给提供普通png格式图片,其实自己做也是非常简单。
.9图的制作通过使用ADT自带的编辑器,把普通的png图片编辑成.9.png的图片, 作图工具如下:
关于.9.png的几个参数,只要看一下这张图您就懂了
官方中关于屏幕适配的几点建议:
拉伸和压缩你的布局,以适应各种不同的高度和宽度。
在更大的设备上,可以利用额外的屏幕。结合多个视图 创建复合控件来显示更多内容和轻松导航。
为不同的屏幕密度(DPI)设备提供多套资源,以确保应用程序在任何设备上看起来不错。
1.px , dp,sp的定义
px(pixels)像素,意思是屏幕上的点。在设计领域中,像素是用来计算数码影像的最小单位。如 800*400。dpi 是Dots Per Inch的缩写, 每英寸点数,即每英寸包含像素个数。比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。手机dpi越大也就是俗称分辨率也高。
dp 也即dip,设备独立像素,device independent pixels的缩写,Android特有的单位,在屏幕密度dpi = 160屏幕上,1dp = 1px。android为了支持LDPI (120dpi), MDPI (160dpi), HDPI(240dpi),
XHDPI (320dpi), and XXHDPI(480dpi) 使用这个,而不依赖像素单位。在定义布局width/height值,推荐使用dp作单位。 dx和dp的换算:dx=dp*density
sp scaled pixels(比例放大像素). 主要用于字体显示best for textsize,sp是为了保证相同字号的字在不同PPI屏幕上显示的物理高度一致。
2.单位的换算,设备屏幕信息
1)、获取设备的屏幕信息
/** * 获取设备的屏幕信息 * * @return */ public static void getWindowInfo(Context context) { // DisplayMetrics类用于屏幕的描述信息 DisplayMetrics displayMetrics = context.getResources() .getDisplayMetrics(); // 获取屏幕密度,在dpi=160的设备上density=1; density=dpi/160 float density = displayMetrics.density; // 获取屏幕dpi,即每英寸包含像素个数 int dpi = displayMetrics.densityDpi; // 获取屏幕像素宽度 px int width = displayMetrics.widthPixels; // 获取屏幕像素高度 px int height = displayMetrics.heightPixels; Log.i(TAG, "屏幕密度:" + density + "\t dpi=" + dpi + "\t width=" + width + "\t height=" + height); }
2)、单位的换算,px和dp的相互换算
/** * 把px 转化为dip * * @param context * @param px * @return */ public static int px2dip(Context context, float px) { float density = context.getResources().getDisplayMetrics().density;// 密度 int dip = (int) (px / density + 0.5f); return dip; } /** * 把dip转化为px * * @param context * @param dp * @return */ public static float dip2px(Context context, float dp) { float density = context.getResources().getDisplayMetrics().density;// 密度 float px = dp * density; return px; }
3)、屏幕坐标的获取
Android的屏幕坐标是从 左上角(0,0)起始,右下角结束。以1280*720手机为例,屏幕坐标如下图,单位为PXview.getLocationOnScreen(pos); // 获取在当前窗口内的绝对坐标
view.getLocationInWindow(pos); // 得到view在整个屏幕内上的位置
注意:该方法在oncreate中执行返回值为(0,0),因为该控件还未在activity中生成,建议在 onWindowFocusChanged(boolean hasFocus) 方法中调用
/** * 获取指定控件的坐标[只能再oncreate之后的生命周期中执行,否则返回(0,0)] * * @param view * 指定控件 * @return 长度为2的int数组pos,X=pos[0] ,Y=pos[1] */ public static int[] getPosition(View view) { int pos[] = new int[2]; // 获取在当前窗口内的绝对坐标 // view.getLocationOnScreen(pos); // 得到view在整个屏幕内上的位置 view.getLocationInWindow(pos); Log.i(TAG, pos[0] + "---" + pos[1]); return pos; }
4)、获取Android手机顶部状态栏高度,底部虚拟键盘位置的获取
实际开发中会遇到获取顶部状态栏的高度的情况,如设置全屏PopupWindow需要设置popupWindow的高度= 屏幕高度- 状态栏高度
虚拟按键的情况,针对一些特殊型号的手机,如魅族系列等在屏幕底部时手机的虚拟按键,此时就有必要针对此类型号手机计算虚拟按键的位置或高度,全屏PopupWindow需要设置popupWindow的高度= 屏幕高度- 状态栏高度-底部虚拟键盘高度。
public static int getStatusBarHeight(Activity activity) { Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; // 状态栏高度 int bottomHeight = rect.bottom;// 底部虚拟键盘的 Log.i(TAG, "statusBarHeight=" + statusBarHeight + "---bottomHeight=" + bottomHeight); return statusBarHeight; }
如果该方法获取值0,解决办法可以参看我的另外一篇文章获取android顶部状态栏高度的两种方式
.9.png图片的使用与制作
.9.png是Google发明用于android设备,可可以定义拉伸范围(包含图片边界)作为背景图片拉伸不失真的一种图片,同一图片可适用于多种设备.9.png真可谓是解决屏幕适配的利器,可惜公司美工只给提供普通png格式图片,其实自己做也是非常简单。
.9图的制作通过使用ADT自带的编辑器,把普通的png图片编辑成.9.png的图片, 作图工具如下:
关于.9.png的几个参数,只要看一下这张图您就懂了
相关文章推荐
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- android 获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- Android 获取屏幕信息(状态栏、标题栏高度,屏幕宽高)
- 关于Android中涉及屏幕适配的单位dp,px,sp,dip的学习笔记。
- android 屏幕适配小结
- Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
- Android使用Displaymetrics类获取一下手机屏幕中的一些信息,获取屏幕分辨率
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
- Android 尺寸单位转换和屏幕适配相关
- android获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- android 屏幕适配小结
- android 获取屏幕信息的使用
- android屏幕适配,除了使用dp,还可以使用比例
- Android使用Displaymetrics类获取一下手机屏幕中的一些信息
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- android获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- android获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- 使用CSS3 Media Query技术适配Android平板屏幕分辨率和屏幕密度
- android 屏幕适配小结