Android 设备屏幕信息(dip,sp,px的转换及其运用)

一、参考

1、【Android技术】Android px、dp、sp之间相互转换
2、dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
3、[Android] Android开发中dip,dpi,density,px等详解
4、getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别
5、Android 获取控件的宽和高
6、手动修改屏幕密度:ro.sf.lcd_density

二、实例(屏幕信息,sp,dip,px的获取,转换,运用)

1、截图


Android 设备屏幕信息(dip,sp,px的转换及其运用)_第1张图片
si-1.png

2、代码

/**
     * 屏幕信息
     * densityDpi = density * strDpi(160)
     *
     *  常用屏幕信息三种方法
     *  方法1:
     *  DisplayMetrics mDisplayMetrics = new DisplayMetrics();//屏幕分辨率容器
        getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
        方法2:
        DisplayMetrics mDisplayMetrics = getResources().getDisplayMetrics();
        方法3:
        Display mDisplay = getWindowManager().getDefaultDisplay();
     * */
    private void testScreenInfo(){
        //屏幕尺寸
        DisplayMetrics dm = getResources().getDisplayMetrics();
        int screenWidth = dm.widthPixels;
        int screenHeight = dm.heightPixels;
        int screenDensityDpi = dm.densityDpi;   //屏幕密度
        float screenDessity = dm.density;       //屏幕密度比
        float scaleDensity = dm.scaledDensity;  //文字密度比(放大像素)

        String screeninfo = "屏幕实际尺寸:"+screenWidth+"*"+screenHeight+
                "\n界面密度(标准160):"+screenDensityDpi+
                "\n屏幕密度比:"+screenDessity+",文字密度比:"+scaleDensity;

        LogUtil.i(screeninfo);
        tv_screen_info.setText(screeninfo);

    }


    /**
     * 测试sp,dip,px之间的关系、转换、运用
     * */
    private void testSpDpPx(){
        /*获得*/
        int heightDip = 40; //40dp高度
        int heightSp = 17;  //17sp
        float heightXmlPx = getResources().getDimension(R.dimen.test_height);  //获得dimen定义高度px
        float txtXmlPx = getResources().getDimension(R.dimen.test_tv_size);     //获得dimen定义文字大小px
        float txtSizeLayoutPx = tv_layout.getTextSize();  //获得控件的文字大小px
        //这个需要在onCreate做完之后获得,否则一直为0,怎么获得参考下面的,就不写了
        //参考:http://blog.csdn.net/johnny901114/article/details/7839512
        int heightLayoutPx = tv_layout.getHeight();       //获得控件的高度px, default = 0, error
        heightLayoutPx = tv_layout.getMeasuredHeight();


        /*转换*/
        LogUtil.i("convert : 40dip to "+ DisplayUtil.dip2px(instance,heightDip)+"px ,17sp to "+DisplayUtil.sp2px(instance,heightSp)+
                "px\norg : heightXmlPx:"+heightXmlPx+"px, txtXmlPx="+txtXmlPx+
                "px, heightLayoutPx="+heightLayoutPx+"px, txtSizeLayoutPx="+txtSizeLayoutPx+"px");


        /*运用,动态布局中用得到*/
        tv_code.setTextSize(heightSp);  //这里直接设置需要的sp大小就行了,不需要转换
        tv_code.setHeight(DisplayUtil.dip2px(instance,heightDip));//设置高度,需要px单位
        //另外一种设置宽度,高度方法,比较常用:获得父控件的布局参数,然后设置进去
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tv_code.getLayoutParams();
        //params.weight=1;
        params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        params.height = DisplayUtil.dip2px(instance,heightDip);
        tv_code.setLayoutParams(params);
    }

3、工具类code

public class DisplayUtil {

    /**
     * 将px值转换为dip或dp值,保证尺寸大小不变
     *
     * @param pxValue
     *            (DisplayMetrics类中属性density)
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @param dipValue
     *            (DisplayMetrics类中属性density)
     * @return
     */
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @param dpResid
     *  xml中定义的dp属性
     *  getDimension()                返回float型px值     精确
        getDimensionPixelOffset()     返回int型px值       直接把小数删除
        getDimensionPixelSize()       返回int型px值       进行四舍五入

     * @return
     */
    public static int xmlDip2px(Context context, int dpResid) {
        return context.getResources().getDimensionPixelOffset(dpResid);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     *
     * @param pxValue
     *            (DisplayMetrics类中属性scaledDensity)
     * @return
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     *
     * @param spValue
     *            (DisplayMetrics类中属性scaledDensity)
     * @return
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     *
     * @param spResid
     *  xml中定义的sp属性
     *  getDimension()                返回float型px值     精确
    getDimensionPixelOffset()     返回int型px值       直接把小数删除
    getDimensionPixelSize()       返回int型px值       进行四舍五入

     * @return
     */
    public static int xmlSp2px(Context context, int spResid) {
        return context.getResources().getDimensionPixelOffset(spResid);
    }
}

你可能感兴趣的:(Android 设备屏幕信息(dip,sp,px的转换及其运用))