You need to enable JavaScript to run this app. 如何让Android TextView在文本长度小于屏幕宽度时也能触发跑马灯滚动
优惠活动
大模型
产品
解决方案
定价
更多

如何让Android TextView在文本长度小于屏幕宽度时也能触发跑马灯滚动

解决方案

Android 原生 TextView 跑马灯默认仅在文本宽度大于控件可用宽度时触发,要实现无论文本长短都持续滚动,需要自定义 TextView 改写触发逻辑。

1. 实现自定义跑马灯 TextView

Kotlin 版本代码

class AlwaysMarqueeTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.textViewStyle
) : AppCompatTextView(context, attrs, defStyleAttr) {

    init {
        ellipsize = TextUtils.TruncateAt.MARQUEE
        setSingleLine()
        marqueeRepeatLimit = -1
        isSelected = true
    }

    override fun isFocused(): Boolean {
        return true
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val textWidth = paint.measureText(text.toString())
        val measuredWidth = measuredWidth
        if (textWidth < measuredWidth) {
            setMeasuredDimension(measuredWidth - 1, measuredHeight)
        }
    }

    override fun setText(text: CharSequence?, type: BufferType?) {
        super.setText(text, type)
        requestLayout()
    }
}

Java 版本代码

public class AlwaysMarqueeTextView extends AppCompatTextView {

    public AlwaysMarqueeTextView(Context context) {
        super(context);
        init();
    }

    public AlwaysMarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public AlwaysMarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setEllipsize(TextUtils.TruncateAt.MARQUEE);
        setSingleLine(true);
        setMarqueeRepeatLimit(-1);
        setSelected(true);
    }

    @Override
    public boolean isFocused() {
        return true;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        float textWidth = getPaint().measureText(getText().toString());
        int measuredWidth = getMeasuredWidth();
        if (textWidth < measuredWidth) {
            setMeasuredDimension(measuredWidth - 1, getMeasuredHeight());
        }
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
        requestLayout();
    }
}

2. 替换布局中的原有控件

将XML中原来的TextView替换为自定义控件,注意修改com.your.packagename为你实际的类所在包路径:

<com.your.packagename.AlwaysMarqueeTextView
    android:id="@+id/tickler_message"
    style="@style/AppTheme.MarqueeTextStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:text="@string/placeholder_marquee_text"/>

3. 业务代码适配

原有Activity中的设置文本逻辑无需修改,isSelected配置可保留也可删除,自定义控件已经默认初始化了跑马灯所需的全部参数。

内容的提问来源于stack exchange,提问作者Sandeep Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:45:01