1.像素
老子曾说“天下难事必作于易,天下大事必作于细”,Android开发也是一样,再复杂的App也无非就是数百万个像素点的排列组合。像素虽然看似简单,但是里面大有学问。如果在开发时对像素单位不以为然仅仅一根筋的填数字,最后在模拟器上取得很好效果的界面在真机上也可能东倒西歪,这就是没打好基础的缘故。接下来通过介绍像素的基本概念及单位间的相互转化来进一步理解像素。
Android支持的像素单位有px、in、mm、dp、sp等。其中,px是手机屏幕上可显示的最小的单位,它与物理设备的显示屏有关。dp与物理设备无关,只与屏幕的尺寸有关,一般来说,同样尺寸的屏幕以dp计算的分辨率是一样的。sp的原理跟dp差不多,专门用于设置字体大小,通过sp设置的字体可以在系统设置字体大小(小、普通、大、超大)时有不同的显示效果。
dp和px的联系取决于具体设备上的像素密度,像素密度就是DisplayMetries里的density参数,当density=1.0时代表1dp=1px,当density=1.5时代表2dp=3px。具体的转换函数如下:
//根据手机的分辨率从dp单位转换成px单位 public static int dip2px(Context context,float dpValue){ //获取当前手机的像素密度 final float scale=context.getResources().getDisplayMetrics().density; return (int)(dpValue*scale+0.5f); //四舍五入取整 } //根据手机的分辨率从px单位转换成dp单位 public static int px2dip(Context context,float pxValue){ //获取当前手机的像素密度 final float scale=context.getResources().getDisplayMetrics().density; return (int)(pxValue/scale+0.5f); //四舍五入取整 }
我们可以将以上转换函数封装到一个工具类中,方便以后使用
在xml布局文件中,为了让不同设备屏幕拥有统一的显示效果,除了sp用于设置文字大小外,其余要用尺寸的地方都用dp,在代码中的情况又有所不同,Android用于设置大小的函数都是以px为单位,无论是LayoutParams里的width和height,还是setMargins和setPadding,参数单位都是px,要想在代码中设置布局大小或间距,得先把dp值转换成px值,代码应用如下:
//将10dp对应的尺寸大小转换为对应的px数值 int dip_10=Utils.dip2px(this,10L); //从布局文件中获取名叫tv_padding的文本视图 TextView tv_padding=findViewById(R.id.tv_padding); //设置该文本视图的内部文字与控件四周的间隔大小 tv_padding.setPadding(dip_10,dip_10,dip_10,dip_10);
2.屏幕分辨率
在APP代码中时常要取手机的屏幕分辨率(当前屏幕的宽和高),然后动态调整界面上的布局。在代码中获取分辨率就是获取DisplayMetrics对象,然后从该对象中获得宽、高、像素密度等信息。下面是DisplayMetrics类的常用属性说明:
·widthPixels:以px为单位计量的宽度值
·heightPixels:以px为单位计量的高度值
·density:像素密度,即一个dp单位包含多少个px单位
下面是获取当前屏幕的宽度、高度的示例,像素密度的获取上面代码已经给出,不再重复
public static int getScreenWidth(Context context){ //从系统服务中获取窗口管理器 WindowManager windowManager=(WindowManager)context.getSystemService(context.WINDOW_SERVICE); DisplayMetrics displayMetrics=new DisplayMetrics(); //从默认显示器中获取显示参数保存到displayMetrics对象中 windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; //返回屏幕的宽度数值 } public static int getScreenHeight(Context context){ //从系统服务中获取窗口管理器 WindowManager windowManager=(WindowManager)context.getSystemService(context.WINDOW_SERVICE); DisplayMetrics displayMetrics=new DisplayMetrics(); //从默认显示器中获取显示参数保存到displayMetrics对象中 windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; //返回屏幕的高度数值 }
在接入设备上获得分辨率信息显示如下:
3.颜色
在Android中,颜色值由透明度alpha和RGB三原色定义,有八位十六进制和六位十六进制两种编码,其中需要注意的是,六位十六进制编码有两种情况,在XML文件中默认不透明(透明度为FF),在代码中默认透明(透明度为00),下面的代码分别给两个文本控件设置六位编码和八位编码的背景色。
TextView tv2= (TextView) findViewById(R.id.tv2); tv2.setBackgroundColor(0x00ff00); TextView tv3= (TextView) findViewById(R.id.tv3); tv3.setBackgroundColor(0xff00ff00);
可以看到,代码使用六位编码看不到任何背景,使用八位编码能看到正确的绿色背景。
所以代码中一般不用六位编码,因为使用了和不使用没什么区别。