Android с автоматической горизонтальной прокруткой TextView
Я пытаюсь реализовать однострочный текстовый вид, который будет автоматически прокручиваться. Но я, к сожалению, не могу заставить его работать. AutoScrollTextView объявляется внутри LinearLayout (width и height = 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);
}
};
}
Ответы
Ответ 1
Если вам не нужен подкласс класса 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);
[Ответ отредактирован на основе комментариев]
Ответ 2
Мое решение работает:
<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
, например.
Ответ 3
После этого 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);
который, наконец, сделал мою работу
Ответ 4
Иногда invalidate не работает, пока вы не вызываете invalidate в основном потоке, как показано ниже:
handler.post(new Runnable() {
@Override
public void run() {
yourView.invalidate();
}
});
Ответ 5
// 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" />