Как известно, у 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; } }
Можно добавлять на экран сколько угодно таких компонентов, они все будут радостно крутиться, и не понадобится никаких дополнительных атрибутов.
1 комментарий:
Хорошее решение нашли, спасибо! У меня заказчик требует чтобы оно ещё не останавливалось при таком скролле, есть идеи как это переопределить? =)
Отправить комментарий