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);
    }
}
目录
相关文章
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
721 64
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
920 64
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
2606 62
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
1002 61
|
10月前
|
机器学习/深度学习 Android开发 数据安全/隐私保护
手机脚本录制器, 脚本录制器安卓,识图识色屏幕点击器【autojs】
完整的UI界面,包含录制控制按钮和状态显示 屏幕点击动作录制功能,记录点击坐标和时间间隔
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10277 2
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
1559 2
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
591 1
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
513 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
416 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备

热门文章

最新文章