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

简介: 一、参考1、【Android技术】Android px、dp、sp之间相互转换2、dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算3、[Android] Android开发中dip,dpi,density,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、截图


img_845ec1dd56dcb2301f21583091e8fe7f.png
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);
    }
}
目录
相关文章
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
3月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
61 0
|
6天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
1月前
|
Shell 开发工具 Android开发
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
459 2
|
2月前
|
数据库 Android开发 数据库管理
【Android】使用android studio查看内置数据库信息
【Android】使用android studio查看内置数据库信息
64 0
|
3月前
|
开发工具 Android开发
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0
|
4月前
|
物联网 Android开发
【Android App】低功耗蓝牙中扫描BLE设备的讲解及实战(附源码和演示 超详细)
【Android App】低功耗蓝牙中扫描BLE设备的讲解及实战(附源码和演示 超详细)
92 0
|
API 网络安全 Android开发
Android 设备唯一标识(适配Android版本)
Android 设备唯一标识(适配Android版本)
784 0
Android 设备唯一标识(适配Android版本)
|
存储 API Android开发
Android设备唯一标识的获取和构造
设备唯一标识对于app开发是很重要的一个点,主要应用于统计,有时也应用于业务。 Android平台提供了很多获取唯一标识的API,但都不是很稳定。 一、获取唯一标识 Android开发者网站上的一篇文章Identifying App Installations给出了几种获取方式; 中文博文也有很多,这是其中一篇 Android获取设备唯一ID的几种方式。
1723 0