Android NoteX Q6: 如何实现一行文本居中多行文本左对齐效果?

本文探讨如何在UI设计中避免繁琐地设置多行视图效果,通过判断TextView的行数自动调整对齐方式。遇到设置lines属性导致意外行数显示的问题,并提供了解决方案,包括利用addTextChangedListener监听文本变化,确保根据实际行数设置gravity。讨论了固定行数情况下高度差异及应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 背景

UI设计可能会有如题的需求。写几个View效果来叠加就显得繁琐了,那怎么办呢?

二 思路

判断行数来设置gravity呗?
先来探索下获取TextView行数的结果:

fun setTwoLine(view: View) {
Log.d(TAG,"setTwoLine")
binding.textView.text = "这是很多内容这是很多内容这是很多内容这是很多内容"
    printTextViewLine()
}

fun setTwoLineByN(view: View) {
binding.textView.text = "这是很多\n内容"
    printTextViewLine()
}

fun setMultiLine(view: View) {
binding.textView.text = "这是很多内容这是很多内容这是很多内容这是很多内容很多内容很多内容很多内容很多内容很多内容很多内容很多内容"
    printTextViewLine()
}

输出:

行数为->2
行数为->2
行数为->5

看似是符合预期,但是是有特殊情况的。上面的设置高度为wrap_content,宽度固定,如果手动设置lines=2呢?

结果发现原本应该显示5行的内容,在页面仅仅显示两行,但是但是,行数结果输出却为5。
如果是少于或等于设定行数的值,显示和输出的行数均正常。

@android.view.RemotableViewMethod
public void setLines(int lines) {
mMaximum = mMinimum = lines;
mMaxMode = mMinMode = LINES;

requestLayout();
invalidate();
}

从源码看,设置lines意味着max和min的lines值一样了。

三 解决方案

至于上面在设置lines后输出行数值可能异常的情况,因为已经能判定为多行了,所以也没关系。这样就能做行数判断,判断为一行还是多行时则再去设置gravity。
如下所示:

binding.textView.apply {
    addTextChangedListener {
        gravity = if (lineCount > 1) Gravity.START else Gravity.CENTER
    }
}

延伸

如果设置固定行数了,譬如为2,则内容只有一行和有多行的情况下,TextView的高度是不是一样的?
答:不一样,一行的高度还是低一些。上面的案例是一行为142,两行为157。
共同学习、探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值