android和屏幕适配的相关知识

 

当需要适配不同的屏幕的时候,可能需要用到以下几点:

关于单位的一点说明:
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

Android 获取屏幕高度、标题高度、状态栏高度详解

六、动态更改控件的布局

有些可以通过控件本身的属性函数进行更改(如padding),有些布局属性则不行。此时可以利用其外围iewGroup控件对应的layoutParams来进行布局,通过设置其addRule方法

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(android)