美文网首页
对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