为什么使用跑马灯效果?

经常使用TextView会出现这样的情况,有限的空间内只能写一行,然后导致好多文字被“...”表示了 而且有可能是重要信息被隐藏了,于是就有了跑马灯效果.

什么是TextView跑马灯?


TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果.

一、使用TextView属性来实现


1.布局文件 直接在布局设置数据

<TextView        android:id="@+id/marquee_tv"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:drawableLeft="@drawable/icon"        android:drawablePadding="12dp"        android:ellipsize="marquee"        android:gravity="center_vertical"        android:marqueeRepeatLimit="marquee_forever"        android:singleLine="true"        android:text="这个项目的作用就是让这个单行的很长很长的单独一行的TextView实现跑马灯的效果"        android:textSize="22sp"/>


2. 或者java代码设置数据:

marqueeTv.setText("xxxx...");    marqueeTv.setFocusable(true); // 获取焦点    marqueeTv.setFocusableInTouchMode(true);    marqueeTv.requestFocus();


但是这种方法在有两个TextView的时候不能给两个TextView同时实现跑马灯的效果。

原因:

TextView默认的isFocused()方法默认只能给一个对象实现focused。

解决的办法:

新建一个类MarqueeTextView继承TextView,

让他的isFocused()方法返回true。

注意:子类MarqueeTextView需要实现父类的所有3个构造函数,

不然会有问题 效果:

android button获得焦点 android设置焦点_textview代码 设置style

二、使用自定义View实现

1.自定义一个类,继承TextView并重写isFocused方法,返回true,让其获取焦点


public class MarqueeView extends TextView {    //实现TextView的三个构造函数    public MarqueeView( Context context ) {        super( context );    }    public MarqueeView( Context context,  AttributeSet attrs ) {        super( context, attrs );    }    public MarqueeView( Context context,  AttributeSet attrs, int defStyleAttr ) {        super( context, attrs, defStyleAttr );    }    //重写isFocused()方法    @Override    public boolean isFocused() {        return true;    }}


2.布局文件中使用 将XML文件中默认的TextView控件换成自定义的TextView,    方法是:包名+类名

<com.p.h.MarqueeView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:ellipsize="marquee"        android:focusable="true"        android:focusableInTouchMode="true"        android:gravity="center_vertical"        android:scrollHorizontally=“true”        android:marqueeRepeatLimit="marquee_forever"        android:singleLine="true"         android:text="跑马灯,我来了,大辉儿!大辉儿!大辉儿!大辉儿!大辉儿!大辉儿!"        android:textColor="@color/blue"        android:textSize="25sp"/>


3.属性介绍 marqueeRepeatLimit  表示跑马灯循环的次数,

android:singleLine="true" 

 限制TextView单行显示,避免换行

android:ellipsize="marquee"

以横向滚动方式显示(需要获取当前焦点)

android:focusable="true"

获取焦点

android:focusableInTouchMode="ture" 

触屏模式下可获得焦点

marquee_forever 

表示一直循环,也可以写个数字表示次数然后Activity中可以使设置其setText就ok了;

scrollHorizontally 

表示滚动的方向是否为水平方向; 到这里就结束啦。