代码实现
先贴一下TextView
跑马灯的实现代码:
<TextView
android:id="@+id/fragment_game_detail_header_new_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/common_text"
android:textSize="18.0sp"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"/>
遇到问题
在界面上,有一个用viewPager
实现的广告轮播功能,发现每次切换广告的时候,跑马灯会跳动,并且从头显示,以为是viewPager
与跑马灯冲突,后来在网上搜了一下,android 6.0有时候会出现这个问题。
解决的方法
在跑马灯控件外层,再嵌套一个布局控件:
<LinearLayout
android:id="@+id/fragment_game_detail_header_new_name_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/fragment_game_detail_header_new_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/common_text"
android:textSize="18.0sp"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"/>
</LinearLayout>
总结
1、正常情况下,跑马灯用TextView
实现即可,如果遇到抖动问题,在TextView
外层嵌套一个局部就可以解决问题。
2、如果跑马灯用在列表的item里面,会发现跑马灯并没有跑起来,怎么办呢?只要在ViewHolder
调用TextView.setSelected(true)
就行了。
最后贴上封装的跑马灯TextView
public class MarqueeTextView extends AppCompatTextView {
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setSelected(true);
setSingleLine();
setMarqueeRepeatLimit(Integer.MAX_VALUE);
setEllipsize(TextUtils.TruncateAt.MARQUEE);
}
@Override
public void setSelected(boolean selected) {
super.setSelected(selected);
}
}