如何让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
相关产品推荐
相关产品推荐

