Как известно, у TextView
есть полезный атрибут ellipsize
. Он позволяет установить, как компонент будет себя вести, если текст не влез в отведенную область. none
(по умолчанию) отрежет текст по пробелу, end
поставит в конце многоточие, и так далее.
Самое интересное значение этого атрибута – marquee
. Оно означает, что текст превращается в бегущую строку: сам прокручивается справа налево либо бесконечное, либо определенное число раз (для этого уже другой атрибут – marqueeRepeatLimit
)
Однако, на практике оказывается, что для корректной работы этого атрибута надо долго прыгать с бубном – ставить всякие singleLine
(хоть он и значится deprecated, без него никак), focusable
и прочие нелогичные вещи. Плюс к тому, marquee
работает только тогда, когда компонент в фокусе. Соответственно, добавить на один экран несколько таких компонентов не кажется реальным.
Однако, недавно мне попалось решение, неожиданно простое, и я его сейчас накопипащу:
public class MarqueeTextView extends TextView {
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setEllipsize(TextUtils.TruncateAt.MARQUEE);
setMarqueeRepeatLimit(-1);
setSingleLine(true);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if(focused) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
@Override
public void onWindowFocusChanged(boolean focused) {
if(focused) {
super.onWindowFocusChanged(focused);
}
}
@Override
public boolean isFocused() {
return true;
}
}
Можно добавлять на экран сколько угодно таких компонентов, они все будут радостно крутиться, и не понадобится никаких дополнительных атрибутов.