美文网首页
对Android setMaxEms() 的理解及计算方式

对Android setMaxEms() 的理解及计算方式

作者: MiBoy | 来源:发表于2019-06-23 23:58 被阅读0次

Android UI 的适配想必都会让大家头疼,比如最近我就有一个需求是这样的:


image.png

规则是这样的:

  • 如果这个两个标签的长度超过容器的宽度,设置第一个标签最大字符为6个
  • 如果设置完之后,还超出容器的宽度(有可能第二个很长),第二个不显示,只显示第一个

看起来很简单,但是看到第二条规则,其实就是需要二次测量,就是对第一次设置setMaxEms(6)之后的长度。让我measureText我会,但重点 6个单位的ems的长度是多大呢?带着疑问我Google、百度了很多资料,都怎么说清楚,只是说一个印刷单位

An em is a unit in the field of typography
em是一个印刷排版的单位,表示字宽的单位。 em字面意思为:equal M (和M字符一致的宽度为一个单位)简称em

但是这解决不了问题啊,所以咱们看下源码吧:

   public void setMaxEms(int maxEms) {
        mMaxWidth = maxEms;// 和maxWidth 有关系
        mMaxWidthMode = EMS;
        requestLayout();
        invalidate();
    }

上面的只是设置的,要用到这个maxEms 肯定是会在onMeasure 的时候用到

  if (mMaxWidthMode == EMS) {
                width = Math.min(width, mMaxWidth * getLineHeight());
            } else {
                width = Math.min(width, mMaxWidth);
            }

            if (mMinWidthMode == EMS) {
                width = Math.max(width, mMinWidth * getLineHeight());
            } else {
                width = Math.max(width, mMinWidth);
            }

重点总结:仔细看下,原来你就明白了,一个em 单位的宽度等于行高的高度

相关文章

网友评论

      本文标题:对Android setMaxEms() 的理解及计算方式

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