当需要适配不同的屏幕的时候,可能需要用到以下几点:
关于单位的一点说明:
1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这 这个,不依赖像素。
dip的换算:
dip(value)=(int) (px(value)/1.5 + 0.5)
2. dp: 很简单,和dip是一样的。
3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。
4. sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
备注: 根据google的推荐,像素统一使用dip,字体统一使用sp
举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。
一、获取屏幕的分辨率(宽和高,单位是px)
public void getScreenWidthAndHeight(){ Display display=getWindowManager().getDefaultDisplay() ; screenWidth=display.getWidth(); screenHeight=display.getHeight(); }
不过,经过实验发现,在activity中直接调用以下方法也能够获得:
screenHeight=this.screenHeight; screenWidth=this.screenWidth;
不过不晓得,为什么很少有使用这种方法直接获得的。(其实利用方法一也可以获得对应的密度信息)
//获取屏幕密度和长宽的另外一种方法 public void getDensityAndResolution(Context context){ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); //获得相对密度(0.75,1.0.1.5等) float density=displayMetrics.density; //绝对密度,也就是每个英寸有多少个像素点 int densityDpi=displayMetrics.densityDpi; //获取屏幕的宽度(单位px) screenWidth=displayMetrics.widthPixels; //获取屏幕的高度(单位px) screenHeight=displayMetrics.heightPixels; System.out.println("density:"+density+";densityDpi:"+densityDpi+";screenWidth"+screenWidth+";screenHeight:"+screenHeight); }
三、sp和px之间的转换
public static int dip2px(Context context, float dipValue) { //密度代表的是一英寸有多少个显示点 //分辨率代表长×宽分别为多少个像素点 final float scale = context.getResources().getDisplayMetrics().density; System.out.println("density:" + scale); return (int) (dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }
也可以借助typevalue类:
public int dip2px(int dip){ int px; DisplayMetrics displayMetrics=new DisplayMetrics(); displayMetrics.setToDefaults(); px=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, displayMetrics); return px; }
其他类似
四、获取某个控件的长度和宽度
详见这篇博客
http://blog.csdn.net/johnny901114/article/details/7839512
五,获得获取控件的宽度、高度,已经获取屏幕状态栏、标题栏更详细的讲解可以参照这篇博客
http://www.iteye.com/topic/828830
六、动态更改控件的布局
有些可以通过控件本身的属性函数进行更改(如padding),有些布局属性则不行。此时可以利用其外围iewGroup控件对应的layoutParams来进行布局,通过设置其addRule方法