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が変わっても、ひとまず正常動作するようになりました。
謎い。