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);
    }
}
目录
相关文章
|
25天前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
2月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
25 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
2月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
41 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
2月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
60 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
2月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
34 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
2月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
38 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
2月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
78 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
|
Android开发 Linux 图形学
I.MX6 android 获取framebuffer信息
/******************************************************************************** * I.MX6 android 获取framebuffer信息 * 声明: * 调试显示屏的时候,我们可能会需要去知道我们设置的信息是否正确,或者有时候 * 需要去确认别人的设置的是否正确。
742 0
|
6天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
6天前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
29 1