美文网首页
是Android的自定义View-基础知识-尺寸

是Android的自定义View-基础知识-尺寸

作者: redrain39 | 来源:发表于2020-12-23 13:20 被阅读0次

尺寸规范

关于Android的尺寸是一个老生常谈的话题,尺寸在Android开发中最显著的表现就是对屏幕的适配问题。

关于Android的相关尺寸概念,这里就不一一展开了,贴一个关于设计规范的讲解:
Android UI界面设计规范完整版

这里主要拿出Android所特有的尺寸单位:

  • px——像素(不是特有)
  • dp——描述间距单位
  • sp——描述字号单位

px

px,这个单位是一个通用单位,像素可以理解为像素点个数,是不可分割的最小单位(定义上)。

大家可能都听说过分辨率的概念,比如72像素/英寸,这就表示将1英寸分为72份,每一份作为一个像素点,所以说像素是没有固定大小的,它是和所承载的分辨率有关系的。

dp

正因为像素和分辨率有关系,Android经过这么多年的发展,不同分辨率的手机屏幕已经五花八门,如果直接使用px进行UI层面的开发,必然会出现很多适配问题,所以Android引入了dp的概念。

dp是px结合了分辨率所得出来的一个普适性的数字,对于碎片化的Android屏幕来说,它较好的给了尺寸一个普适参考。(具体计算方式见上文中的链接哦)

sp

sp的引入和dp的目的是一样的,但是适用的对象不太一样,sp更多地用来描述文字的大小,所达到的效果和dp是一样的。

这和Android系统的一个功能有关,用户可以对字号进行控制,那就意味着我们开发者设置的sp只是一个参考值,它会结合用户的选项共同作用于文字的大小,因此将其和dp进行了区分。

注:很多开发者在开发中将文字大小也设置为dp,这是一种不好的实践,正确的应该去根据用户的选择做好相关的适配工作。

Android中所引入的单位及单位转换

Android中所引入的单位:

  • COMPLEX_UNIT_PX
  • COMPLEX_UNIT_DIP
  • COMPLEX_UNIT_SP
  • COMPLEX_UNIT_PT
  • COMPLEX_UNIT_IN
  • COMPLEX_UNIT_MM

在Android中标记的单位如上,分别对应了:

尺寸单位 说明
dp 与密度无关的像素-基于屏幕物理密度的抽象单位,为不同设备的UI元素的实际大小提供了一致性
sp 与缩放无关的像素-就像dp单位一样,一般用于字体的单位
pt 点数-基于屏幕的物理尺寸的1/72英寸(假设屏幕密度为72dpi)。
px 像素-对应于屏幕上的实际像素。不建议使用此度量单位,因为实际的表示可能会因设备而异。
mm 毫米-基于屏幕的物理尺寸。
in 英寸-基于屏幕的物理尺寸。

由于在Android对尺寸进行处理时使用的都是px,那么就存在一个尺寸转化的问题,Android向我们提供了一个方法:

public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
    switch (unit) {
        case COMPLEX_UNIT_PX:   // px to px
            return value;
        case COMPLEX_UNIT_DIP:  // dp to px
            return value * metrics.density;
        case COMPLEX_UNIT_SP:   // sp to px
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:   // pt to px
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:   // in to px
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:   // mm to px
            return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
}

这个方法包含在TypedValue类中。

因此我们可以定义一个工具类来简化单位转化的操作:

/**
 * 像素密度工具
 *
 * 相关概念:
 * px: 像素
 * dp: 屏幕密度的抽象单位
 * sp: 根据用户的字体大小首选项进行缩放
 * pt: 磅
 * in: 英寸
 * mm: 毫米
 */
object DensityUtils {

    /**
     * dp to px
     * @param value     dp value
     * @return          px value
     */
    fun dp2px(value: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, value,
            Resources.getSystem().displayMetrics
        )
    }

    /**
     * sp to px
     * @param value     sp value
     * @return          px value
     */
    fun sp2px(value: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, value,
            Resources.getSystem().displayMetrics
        )
    }

    /**
     * pt to px
     * @param value     pt value
     * @return          px value
     */
    fun pt2px(value: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_PT, value,
            Resources.getSystem().displayMetrics
        )
    }

    /**
     * in to px
     * @param value     in value
     * @return          px value
     */
    fun in2px(value: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_IN, value,
            Resources.getSystem().displayMetrics
        )
    }

    /**
     * mm to px
     * @param value     mm value
     * @return          px value
     */
    fun mm2px(value: Float): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_MM, value,
            Resources.getSystem().displayMetrics
        )
    }
}

屏幕尺寸

说到尺寸了,那就把屏幕尺寸相关的内容也一起贴出来。

屏幕宽高

说起屏幕尺寸,首先想到的是屏幕的宽高,在我们的项目中经常会使用到屏幕的宽高来进行一些尺寸的适配。

贴出一个可以直接使用的工具类:

/**
 * 屏幕参数工具
 */
object ScreenUtils {

    private fun getDisplayMetrics(): DisplayMetrics {
        return Resources.getSystem().displayMetrics
    }

    /**
     * 获取屏幕宽度
     */
    fun getScreenWidth(): Int {
        return getDisplayMetrics().widthPixels
    }

    /**
     * 获取屏幕高度
     */
    fun getScreenHeight(): Int {
        return getDisplayMetrics().heightPixels
    }
}

其实获取屏幕宽高的方式还有很多,但是那些方法大多数不是很直观或者需要上下文不是很方便,就写出来了,感兴趣的同学可以自己查找一下其它方法。

总结

关于Android中尺寸的基础概念就讲到这里,重要的是理清楚各个尺寸单位的概念和尺寸之间的转化,在之后文章不会混淆,如果有什么不理解或是错误之处可以联系我,一起交流解惑。

相关文章

网友评论

      本文标题:是Android的自定义View-基础知识-尺寸

      本文链接:https://www.haomeiwen.com/subject/svbynktx.html