• home
  • Android TextViewのmarqueeの挙動

Android TextViewのmarqueeの挙動

三年目のfushimiです。

今回はAndroidの開発で地味にハマったとこをメモ。

 

世の中にはmarqueeエフェクトなるものがあります。HTMLでいうこれなんですが。↙︎

vr

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

 

謎い。