如果 android 中的文本较少,则选取框文本不会移动

Marque text not moving if texts are less in android

我正在使用下面的代码,它适用于大语句,但不适用于像 "hello".

这样的小文本
<TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:maxLines="1"
            android:scrollHorizontally="true"
            android:singleLine="true"
            android:text="this_bill_has_some_unipay_points_promotion"/>

而不是 android:layout_width="match_parent" 你必须设置布局宽度喜欢 (30dp 40dp) 因为当字符长于视图的宽度时,选取框被启用。

您应该调用 TextView.isSelected = true 来开始移动文本。

编辑:工作解决方案

<TextView
     android:id="@+id/textView"
     android:layout_width="match_parent"             
     android:layout_height="48dp"
     android:ellipsize="marquee"
     android:gravity="center_vertical"
     android:scrollHorizontally="true"
     android:singleLine="true"
     android:textColor="@android:color/white" />

扩展函数

fun TextView.setMovingText(text: String) = this.post {
            val textWidth = this.paint.measureText(text)
            val spaceWidth = this.paint.measureText(" ")
            val requiredAdditionalSpace = ((this.width - textWidth) / spaceWidth).toInt()
            this.text = StringBuilder(text).apply {
                for (i in 0..requiredAdditionalSpace) {
                    append(" ")
                }
            }
            this.isSelected = true
        }

如何使用

textView.setMovingText("Hey")

我只是想展示一个可行的解决方案。您也可以(应该)修改以获得更好的性能并检查负值。

是的,根据选取框 属性 如果文本小于布局的宽度,则不应滚动。

如果你仍然想移动它,那么你可以设置视图的 manually/static 宽度设置,文本将移动,在布局中。xml 文件你得到宽度的想法文本视图。仍有问题让我知道。