Android TextViewのmarqueeの挙動
三年目のfushimiです。
今回はAndroidの開発で地味にハマったとこをメモ。
世の中にはmarqueeエフェクトなるものがあります。HTMLでいうこれなんですが。↙︎

( http://www.mbs1179.com/ さんから)
要するに文字が1行に収まりきらない時に文字を流すエフェクトです。
Androidのアプリ開発でこれを使う機会がありまして、妙な挙動があったのでメモります。
デフォルトのTextViewにはmarquee設定用の属性が一応あります。
(こんなの)
[xml]
<TextView
 android:ellipsize="marquee"
 android:focusable="true"
 android:focusableInTouchMode="true"
 android:singleLine="true"
 android:marqueeRepeatLimit="marquee_forever"
 android:textColor="@color/playerText"
 android:id="@+id/song_title"
 android:text="@{nowSong.title}"
 android:textStyle="bold"
 android:textSize="20dp"
 android:layout_centerHorizontal="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />
[/xml]
しかしこのTextView、focusが当たってる時にしか動作しません。それだけならまだいいのですが、
他のTextViewにsetTextを叩くと、そちらにfocusが移り、marqueeのアニメーションがリセットされてしまいます。カクカク。
もちろん複数のTetViewにmarqueeを設定することもできません。
いろんな方法を試した方がおられるようですが、こちらにシンプルな解決法がありました。
どうやら同じViewGroup内に他のTextがなければOKなようです。そこで、TextViewを一段階他のレイアウトでラップします。
[xml]
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
 <TextView
 android:ellipsize="marquee"
 android:focusable="true"
 android:focusableInTouchMode="true"
 android:singleLine="true"
 android:marqueeRepeatLimit="marquee_forever"
 android:scrollHorizontally="true"
 android:duplicateParentState="true"
 android:layout_margin="16dp"
 android:id="@+id/artist_name"
 android:textColor="@color/playerText"
 android:layout_below="@+id/song_title"
 android:text="@{nowSong.artist_name}"
 android:layout_centerHorizontal="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />;
</LinearLayout>;
[/xml]
これで他のTextViewにsetTextしてfocusが変わっても、ひとまず正常動作するようになりました。
謎い。


