ems, всупереч поширеній думці (або, принаймні, з більшості повідомлень про ems тут), не базується на ширині одиниці "M".
Спочатку це було так у типографіці, але в цифровому носії, включаючи Android, його значення було зміщено на розмір використовуваного шрифту або, іншими словами, на його висоту (виключаючи будь-які відступи для акцентів / діакритики).
Це означає, що коли ви вказуєте emsдля TextView, він використовуватиме його textSizeяк основу і помножить на emsвказаний.
Як зразок, якщо ви встановите 16sp TextView emsна 4, його ширина буде 64sp в ширину. Ви можете легко перевірити його, використовуючи два TextView (із includeFontPaddingвстановленим значенням false) поруч у ConstraintLayout (щоб використовувати його layout_constraintDimensionRatio).
sp.