一 、像素
Android 支持的像素单位有:px(像素)、in(英寸)、mm(毫米)、pt(磅1/72英寸)、 dp(与设备无关的显示单位)、 dip(就是dp)、 sp(用于设置字体的大小) .常用的有 px 、dp、 sp三种。
px 是手机屏幕上可显示的最小单位,与物理设备的显示屏无关。一般来说同样尺寸的屏幕 看起来越清晰,像素密度越高,以px计量的分辨率也越高。
dp 与物理设备无关,只与屏幕的尺寸有关。一般来说,同样尺寸的屏幕以dp计量的分辨率是一样的,无论这个手机是哪个厂家生产的,dp 大小都是一样的。
sp 的原理跟dp差不多,专门用于设置字体大小。手机在系统设置里可以调整字体的大小(小、普通、大、超大)。设置普通字体时,同数值dp和sp的文字看起来一样大。如果设置为大字体,用dp设置的文字大小没有变化,用sp设置的字体就会变大。 dp 和sp 之间的联系取决于具体设备上的像素密度,像素密度就是DisplayMetrics里的density 参数。当density = 1.0时,表示一个dp值对应一个sp值;当density = 1.5 时,表示两个dp值对应3个px值;当density = 2.0时,表示一个dp值对应2个px值;
public class Utils { /** * 根据手机分辨率从DP转成PX * @param context * @param dpValue * @return */ public static int dip2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率PX(像素)转成DP * @param context * @param pxValue * @return */ public static int px2dip(Context context, float pxValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 将sp值转换为px值,保证文字大小不变 * @param spValue * @return */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * 将px值转换为sp值,保证文字大小不变 * @param pxValue * @return */ public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } }
在 XML布局文件中,为了让不同的设备屏幕拥有统一的显示效果,除了sp用于设置文字大小外,其余要用大小的地方都用sp。在代码中情况又有所不同,Android用于设置大小的函数都是以px为单位。无论是LayoutParams 里的width和height ,还是setMargins 和setPadding ,参数单位都是px ,要想在代码中使用dp设置布局大小或间距,得先把dp值转换成px值 代码如下:
int dip_10 = Utils.dip2px(this,10L); TextView tv_padding = (TextView)findViewById(R.id.tv_padding); tv_padding.setPadding(dip_10,dip_10,dip_10,dip_10);二、颜色
在Android 中颜色由透明度alpha 和RGB 三原色定义,有八位16进制数与六位十六进制数两种编码。例如八位编码 FFEEDDCC ,FF表示透明度,EE表示红色的浓度,CC表示蓝色的浓度,CC表示绿色的浓度。
tv_padding.setBackgroundColor(0x00ff00); tv_padding.setBackgroundColor(0xff00ff00); //设置系统已定义的颜色 tv_padding.setBackgroundColor(Color.BLACK);六位十六进制编码有两种情况 ,在XML文件中默认不透明(FF),在代码中默认透明(00)
在布局文件中设置颜色需要在色值前面加“#” 在代码中0x;
使用colors.xml中定义的颜色
res/values 目录 下有个colors.xml 文件,是颜色常量的定义文件。如果要在布局文件中使用XML颜色常量,可引用“@color/常量名” ;如果要在代码中使用XML颜色常量可通过代码获取:getResource().getColor(R.color.常量名)
三、屏幕分辨率
public void getAndroiodScreenProperty() { WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; // 屏幕宽度(像素) int height = dm.heightPixels; // 屏幕高度(像素) float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = dm.densityDpi; // 屏幕密度dpi(120 / 160 / 240) // 屏幕宽度算法:屏幕宽度(像素)/屏幕密度 int screenWidth = (int) (width / density); // 屏幕宽度(dp) int screenHeight = (int) (height / density);// 屏幕高度(dp) Log.d("h_bl", "屏幕宽度(像素):" + width); Log.d("h_bl", "屏幕高度(像素):" + height); Log.d("h_bl", "屏幕密度(0.75 / 1.0 / 1.5):" + density); Log.d("h_bl", "屏幕密度dpi(120 / 160 / 240):" + densityDpi); Log.d("h_bl", "屏幕宽度(dp):" + screenWidth); Log.d("h_bl", "屏幕高度(dp):" + screenHeight); }