Android с автоматической горизонтальной прокруткой TextView - PullRequest
52 голосов
/ 29 марта 2011

Я пытаюсь реализовать однострочное текстовое представление, которое будет прокручиваться автоматически. Но, к сожалению, я не могу заставить его работать. AutoScrollTextView объявлен внутри LinearLayout (ширина и высота = fill_parent). Класс в основном использует обработчик, который вызывает себя для прокрутки на заданную сумму. Я упростил код, чтобы показывать только текстовое представление, которое должно прокручиваться на 5 пикселей каждую секунду.

Вывод журнала корректен, метод getScrollX () возвращает соответствующую позицию scrollX.

Если я не позвоню requestLayout(), ничего не получится. invalidate() не имеет никакого эффекта.

У кого-нибудь есть подсказка?

public class AutoScrollTextView extends TextView {

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setSingleLine();
        setEllipsize(null);
        setText("Single-line text view that scrolls automatically if the text is too long to fit in the widget");
    }

    // begin to scroll the text from the original position
    public void startScrolling() {
        scrollHandler.sendEmptyMessage(0);
    }

    private Handler scrollHandler = new Handler() {
        private static final int REFRESH_INTERVAL = 1000;

        public void handleMessage(Message msg) {
            scrollBy(5, 0);
            requestLayout();
            Log.debug("Scrolled to " + getScrollX() + " px");
            sendEmptyMessageDelayed(0, REFRESH_INTERVAL);
        }
    };
}

Ответы [ 5 ]

181 голосов
/ 29 марта 2011

Если вам не нужно подкласса TextView, вы можете попробовать это в файле макета:

    <TextView
        android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true" 
        android:scrollHorizontally="true"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>

Кроме того, в вашем коде используйте следующее:

findViewById(R.id.serviceColorCode).setSelected(true);

[Ответ отредактирован на основе комментариев]

18 голосов
/ 11 декабря 2015

После этого XML-кода, на который ответил @ rajat

<TextView
        android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        android:singleLine="true" 
        android:ellipsize="marquee"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true" 
        android:scrollHorizontally="true"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>

Нам нужно установить

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

, который, наконец, сделал мою работу

16 голосов
/ 05 ноября 2013

Мое решение работает:

<TextView
     android:id="@+id/titolotxt"
     android:layout_width="..."
     android:layout_height="..."
     android:ellipsize="marquee"
     android:gravity="left"
     android:marqueeRepeatLimit="marquee_forever"
     android:singleLine="true"
     android:text="@string/titolo"/>

И TextView должен быть установлен выбран: textView.setSelected(true); по коду onCreate, например.

1 голос
/ 22 декабря 2016
// this TextView will marquee because it is selected
TextView marqueeText1 = (TextView) findViewById(R.id.marquee_text_1);
marqueeText1.setSelected(true);

<TextView
    android:id="@+id/marquee_text_1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    android:textSize="24sp"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:scrollHorizontally="true" />
0 голосов
/ 06 февраля 2014

Иногда аннулирование не работает, пока вы не вызовете аннулирование в основном потоке, как показано ниже:

handler.post(new Runnable() {

        @Override
        public void run() {
            yourView.invalidate();
        }
    });
...