Android 浅谈 maxEms 属性

简介:       小菜最近调整一个小需求,为了整体显示效果,需要限制一部分文字的长度,超过部分以...代替。      小菜本想偷个懒,用 android:maxLength="6" 属性配合 android:maxLines="1" 以及 android:ellipsize="end" 来实现,但是只可限制字符床度为6,没有省略号。

      小菜最近调整一个小需求,为了整体显示效果,需要限制一部分文字的长度,超过部分以...代替。
      小菜本想偷个懒,用 android:maxLength="6" 属性配合 android:maxLines="1" 以及 android:ellipsize="end" 来实现,但是只可限制字符床度为6,没有省略号。然后想起有一个 android:maxEms="6" 属性来实现,默认超过长度以省略号结束。结果发现并非按字符长度计算,小菜还是太天真了。

android:maxEms="6"


Tips1: android:singleLine="true" 属性已经在 API 中不建议使用,小菜在现有的设备中测试与 android:maxLines="1" 属性效果完全一致。
Tips2: 在使用 android:maxEms="6" 属性时, TextView 的宽度需为 wrap_content 方式。


以下是小菜测试时遇到的问题:
左侧是从 maxEms = “1” 开始递增到 “16”,右侧是测量文字所占的宽度:


纯汉字
纯字母

纯数字

测试发现:

  1. 无论是文字还是字母或是数字,设置完 maxEms 之后,文字所占的宽度是一致的,随着 maxEms 的递增,文字的宽度也是相同幅度递增的;
  2. 不管是文字还是字母或数字,都不是单纯的按照字符个数来展示的,而是所占屏幕的宽度,所以并不是网上一些朋友说的显示内容为 maxEms - 1 +”...“。
  3. 若限制字符串长度请尝试 maxLength,若字号不变,限制文字所在屏幕宽度,可尝试 maxEms。

TextView 源码中 maxEms

/**
* Makes the TextView at most this many ems wide
*
* @attr ref android.R.styleable#TextView_maxEms
*/
@android.view.RemotableViewMethod
public void setMaxEms(int maxems) {
    mMaxWidth = maxems;
    mMaxWidthMode = EMS;
    requestLayout();
    invalidate();
}
/**
* @return the maximum width of the TextView, expressed in ems or -1 if the maximum width
* was set in pixels instead (using {@link #setMaxWidth(int)} or {@link #setWidth(int)}).
* 文本视图的最大宽度,以EMS表示,或如果宽度为1,则表示最大宽度
* 设置为像素(使用{@ Link LyStMax宽度(int)}或{@ Link LyStSuffelt(int)})
* @see #setMaxEms(int)
* @see #setEms(int)
*
* @attr ref android.R.styleable#TextView_maxEms
*/
public int getMaxEms() {
    return mMaxWidthMode == EMS ? mMaxWidth : -1;
}

小菜查阅相关资料以及自己的理解是:

  1. em 是字体宽度的排版单位,16 点字体中的一个是 16 分;
  2. em 和 ex 单元取决于字体,并且对于文档中的每个元素可能不同。em 只是字体大小。在具有 2in 字体的元素中,1em 因此意味着 2in。在 em 中表示大小,例如边距和填充,意味着它们与字体大小有关,并且如果用户有大字体(例如,在大屏幕上)或小字体(例如,在手持设备上),大小将成比例。
  3. 它是字母 M 在给定的英语字体大小中的宽度。所以 2em 是这个字体中字母 M 的两倍。字体不同于英语,它是这个字体中最宽的字母宽度,这个宽度是不同的像素大小,然后是英语字体中的 M 的宽度大小,但是它仍然是 1EM。所以如果我用 12sp 的英文字体使用文本,1M 相对于这个 12sp 的英语字体,用意大利字体加上1。

测试主要代码:

// xml 中 TextView
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxEms="6"
    android:maxLines="1"
    android:text="@string/test_str1" />
// Kotlin 获取文字宽度
fun getTextViewWidth(tv: TextView): String {
    val spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    tv.measure(spec, spec)
    val measuredWidthTicketNum = tv.getMeasuredWidth()
    return measuredWidthTicketNum.toString()
}

      下面是小菜的公众号,欢迎闲来吐槽~


小菜公众号
目录
相关文章
|
7月前
|
Shell API Android开发
android queries属性
android queries属性
544 2
|
7月前
|
XML Java Android开发
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
133 1
|
4月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
68 0
|
7月前
|
Java Android开发 C++
Android源代码定制:MK文件执行顺序|属性覆盖
Android源代码定制:MK文件执行顺序|属性覆盖
427 2
Android源代码定制:MK文件执行顺序|属性覆盖
|
7月前
|
缓存 安全 Java
Android中的persistent属性
Android中的persistent属性
338 2
|
7月前
|
Android开发
通过反射方式获取Android设备系统属性
通过反射方式获取Android设备系统属性 【5月更文挑战第1天】
132 2
|
7月前
|
Android开发 C++
Android 系统属性(SystemProperties)
Android 系统属性(SystemProperties)
277 1
|
7月前
|
测试技术 Android开发 开发者
RK3568 Android系统客制化动态替换ro任意属性
RK3568 Android系统客制化动态替换ro任意属性
322 1
|
7月前
|
Android开发
Android android:exported="true" 属性
Android android:exported="true" 属性
1082 0
|
7月前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
55 0