Android中长TextView实现跑马灯效果

在Android开发中有时候我们会在一个TextView中输入较长的字符串,当输入较长字符串时手机屏幕可能会无法完全显示文本的内容。
例如:
<TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="长的TextView,长的TextView,长的TextView,长的TextView"
        />
这样一个TextView的内容一行显示不全,系统默认情况下会自动换行,为了不让文本自动换行我们需要加一条属性:
 android:singleLine="true"

这样我们的文本就会只在一行中显示了,但是执行完效果后会发现不完全显示的文本会显示省略号,可以通过添加

android:ellipsize="marquee"

属性设置,此时可以解决省略号的问题,但是并不能实现跑马灯的效果,如果想要实现跑马灯的效果还需要加上两条属性

android:focusable="true"
android:focusableInTouchMode="true"

这样就可以实现跑马灯效果了。但是,你以为这样就完了,错了,此时让我们把布局设置的稍微复杂一点,在文本框下再添加一个文本框同样按上边的文本框进行设置,运行后你会发现:理想很丰满,现实很骨感。 第二个文本框并不会显示跑马灯效果,很多小伙伴感到很诧异,这是为啥 呢?很简单第一个文本框设置的属性android:focusable="true"此时的焦点已经放到了第一个文本框上,返回为true,所以第二个文本框设置的焦点属性就不管用了,此时我们要想别的办法让两个文本框都能获得焦点,我告诉大家一个方法,自己重写一个TextView组件,代码如下:

public class MyTextView extends TextView {

    public MyTextView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
    @Override
    public boolean isFocused() {
        // TODO Auto-generated method stub
        return true;
    }

}

然后将TextView组件换成自己重写的MyTextView即可完美解决了。
ok 拜拜 有兴趣的小伙伴自己试试吧!

你可能感兴趣的:(android,textview,布局)