一 背景
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。
网友评论