Updated on 2016-07-13

通过自定义 Android 控件实现多个文本跑马灯效果。

单个跑马灯

布局文件
<TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Long Text,Long Text,Long Text."
        android:textSize="30sp"

        android:singleLine="true"     强制为单行
        android:ellipsize="marquee"     文字溢出效果为跑马灯(需要在选中状态)
        android:focusable="true"     可以设为选中状态
        android:focusableInTouchMode="true"     在触摸模式下可以设为选中状态
        />

多个跑马灯

布局文件
<com.example.system.myapplication.MyTextView     使用自定义控件的类
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Long Text,Long Text,Long Text."
        android:textSize="30sp"

        android:singleLine="true"     强制为单行
        android:ellipsize="marquee"     文字溢出效果为跑马灯需要在选中状态
        />

<com.example.system.myapplication.MyTextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Long Text,Long Text,Long Text."
        android:textSize="30sp"

        android:singleLine="true"
        android:ellipsize="marquee"
        />

----

自定义控件的类 - MyTextView
public class MyTextView extends TextView {     继承于 TextView 并重写它的 isFocused() 方法
    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override     重写判断是否为焦点的方法
    public boolean isFocused() {
        return true;     始终返回 true代表一直有焦点
    }
}