专栏首页老欧说安卓Android开发笔记(一)像素的单位

Android开发笔记(一)像素的单位

像素类型

老子曾说“天下难事必作于易,天下大事必作于细”,其实Android开发也是如此。博主一开始学android的时候,对像素单位不知其所以然,只知一根筋的填数字,结果在模拟器上跑好好的界面,拿到真机上就显示得东倒西歪,害得自己使劲的找bug,这都是没打好基础的缘故呀。所以一开始就把像素这种基础概念弄清楚,后面会少走很多弯路,开发起来也会更加得心应手。 android支持如下像素单位:px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(与设备无关的显示单位)、dip(就是dp)、sp(用于设置字体大小),其中常用的就是px、dp和sp三种。 个人理解,px是android屏幕上可显示的最小单位,这个与物理设备的显示屏有关系,一般来说,同样尺寸的屏幕(比如说都是4.7寸的手机),看起来越清晰的屏幕,其像素密度越高,以px计量的分辨率就越大。 而dp与物理设备无关,只与屏幕的尺寸有关,一般来说,同样尺寸的屏幕,以dp计量的分辨率都是一样的,不管这个手机是哪个厂家生产,dp大小都一样。 至于sp,其原理跟dp差不多,那为什么说sp专门用于设置字体大小呢?android手机在系统设置里面可以设置字体的大小(小、普通、大、超大),设置普通字体时,同数值dp和sp的文字看起来是一样大的,但如果设置为大字体,用dp设置大小的文字没有变化,而用sp设置大小的文字就变大了。所以说,dp与系统设置的字体大小没有关系,而sp会随系统设置的字体大小来变大或者变小。

dp和px的转换

dp和px之间的联系,取决于具体设备上的像素密度,像素密度就是DisplayMetrics里的density参数。当density=1.0时,表示一个dp值对应一个px值;当density=1.5时,表示两个dp值对应三个px值;当density=2.0时,表示一个dp值对应两个px值。具体的转换函数如下所示:

    /** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)  。
     */  
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }


    /** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 。
     */  
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

代码里面的加0.5f,其目的是四舍五入,因为浮点数强制转为整型时,小数点后面数值会被直接咔嚓掉,所以如果原小数位后大于0.5,再加0.5就会进一,就曲线实现了四舍五入。

dp和px的使用场景

xml布局文件中,因为设备无关性,所以除了sp用于设置文字大小外,其余要用大小的地方都是写dp。但在代码之中,情况又不同,android用于设置大小的函数都是以px为单位。不管是LayoutParams里的width和height,还是setMargins和setPadding,其参数单位都是px,所以要想在代码中使用dp设置布局大小或者间距,得先把dp值转换成px值才好。代码示例

		int dip_10 = Utils.dip2px(mContext, 10L);
		LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams(
				LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		titleParams.setMargins(dip_10, dip_10, dip_10, dip_10);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发笔记(一百六十三)高仿京东的沉浸式状态栏

    前面的文章介绍了如何实现广告轮播的Banner效果,本想可以告一段落。然而某天产品经理心血来潮,拿着苹果手机,要求像iOS那样...

    用户4464237
  • Android开发笔记(一百一十五)设计工具

    UI是User Interface的简称,即用户接口,也称用户界面。UI泛指用户的操作界面,对手机来说,UI设计就是app的页面设计。一个好的UI,不但能让...

    用户4464237
  • Kotlin入门(19)Android的基础布局

    线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右...

    用户4464237
  • P2051 [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大...

    attack
  • 手机端web学习基础--from慕课网

    web知识零零散散的知道一些,但总感觉不够系统,遇到问题不知道如何解决,因此特此来系统的学习一下web前端的知识。从慕课网的web基础看起。下面学习http:/...

    Ryan-Miao
  • 递归,递推以及动态规划总结

    在我的映像里面,当初第一次结束DP的时候,总感觉跟递归还是递归好像!以至于我混淆了他们。

    用户7727433
  • 提示Android屏幕适配方案分析

    Android开发过程中我们常用的尺寸单位有px、dp,还有一种sp一般是用于字体的大小。但是由于px是像素单位,比如我们通常说的手机分辨例如1920*1080...

    用户2356368
  • JavaEE就业学习路线(给初学者以及自学者一个学习方向)

    第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1...

    Java学习
  • Angular 网络连接状态组件

    在开发 Web 应用程序时,有时候我们需要获取当前的网络状态,然后根据不同的网络状态显示不同的提示消息或显示不同页面内容。对于原生应用、混合应用或提供 JS-S...

    阿宝哥
  • mysql数据库备份脚本

    Begin=date +"%Y年%m月%d日 %H:%M:%S" BakDir=/home/backup/backup LogFile=/home/backup...

    @凌晨

扫码关注云+社区

领取腾讯云代金券