Android TextViewのmarqueeの挙動

三年目のfushimiです。

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

 

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

vr

( http://www.mbs1179.com/ さんから)

要するに文字が1行に収まりきらない時に文字を流すエフェクトです。

Androidのアプリ開発でこれを使う機会がありまして、妙な挙動があったのでメモります。

 

デフォルトのTextViewにはmarquee設定用の属性が一応あります。

(こんなの)


<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" />

       

しかしこのTextView、focusが当たってる時にしか動作しません。それだけならまだいいのですが、
他のTextViewにsetTextを叩くと、そちらにfocusが移り、marqueeのアニメーションがリセットされてしまいます。カクカク。
もちろん複数のTetViewにmarqueeを設定することもできません。

いろんな方法を試した方がおられるようですが、こちらにシンプルな解決法がありました。

どうやら同じViewGroup内に他のTextがなければOKなようです。そこで、TextViewを一段階他のレイアウトでラップします。


 <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>;

これで他のTextViewにsetTextしてfocusが変わっても、ひとまず正常動作するようになりました。

 

謎い。

Pocket

Naoto

Wanoで色々やらしてもらってまう

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です