Android: Auto-scrolling text in TextView

2019-02-13 23:44发布

问题:

I've created a series of tabs that have a fixed width of 100px. A tab contains an image with some text below it. If the text is too long to fit, I want it to automatically scroll. I only want one line. I tried the following but it did not work. I am using Android 2.3:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginRight="3dp"
    android:layout_marginTop="3dp"
    android:background="#ff737373"
    android:gravity="center"
    android:minWidth="64dp"
    android:orientation="vertical"
    android:padding="3dp" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="tabImage" >
    </ImageView>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:maxWidth="100px"
        android:tag="tabCaption"
        android:textColor="#ffd9d9d9"
        android:textSize="16sp" />

</LinearLayout>

Any idea why this does not work? I came across the solution from another posting and there the user indicated that it works.

回答1:

In your activity you have to add if you want to marquee on text

  TextView tv=(TextView)findViewById(R.id.textview1);
  tv.setSelected(true);


回答2:

You might want to try this:

https://github.com/kaeppler/ignition/blob/master/ignition-core/ignition-core-lib/src/com/github/ignition/core/widgets/ScrollingTextView.java



回答3:

<TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:gravity="center"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:text="Auto text scroller" 
        android:textSize="50sp"
        />


回答4:

Be aware that if the text is smaller in length than the width of the bounds defined for it it WILL NOT scroll. In this case you may want to extend the text with itself something like:

-. . . . .

String charsInBreak = "   ";
 while (bounds.width() < this.m_width)
 {
    m_text = (m_text + charsInBreak + m_text);
    paint.getTextBounds(m_text, 0, m_text.length(), bounds);
 } 

And if you want your text to marquee forever:

m_textView.setMarqueeRepeatLimit(-1);