TextView实现“跑马灯”滚动显示长文本

    TextView是安卓中最常用的文本显示控件之一,但是作为文本显示控件,它所能显示的字数是有限的,那么问题来了,我们如何利用TextView来滚动显示一个长文本内容呢?

    先来看看我们想要实现的效果

    可以看到一个长文本在TextView中循环的从右向左移动,通过这种方式我们就能在TextView中显示长发文本了,下面我们来看看如何实现这个功能

    首先我们先写一个MyTextView类,让他继承TextView,并重写isFocused方法,修改其返回值为true。这样修改后,用过MyTextView实现的TextView控件将会默认获得焦点。
    代码
package com.example.lowp.textviewoverlength_test;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created by Lowp on 2015/9/7.
 */
public class MyTextView extends TextView {


    /**
     * 实现构造方法
     * @param context
     * @param attrs
     */
    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context) {
        super(context);
    }

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



    /**
     * 让所有的实现该TextView都默认获得焦点
     * @return
     */
    @Override
    public boolean isFocused() {
        return true;
    }
}
    然后,我们在布局文件中通过上面的类来实现TextView控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <com.example.lowp.textviewoverlength_test.MyTextView
        android:padding="20dp"
        android:singleLine="true"
        android:text="@string/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ellipsize="marquee">

    <com.example.lowp.textviewoverlength_test.MyTextView
        android:padding="20dp"
        android:singleLine="true"
        android:text="@string/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ellipsize="marquee"/>

</LinearLayout>
<resources>
    。。。
    <string name="test"> 使用DOM4J的方式解析XML同样需要第三方jar包,如果你对前面三种解析方法都有所了解,那么用过DOM4J方式来解析xml就不会陌生了,话不多说直接上代码</string>
    。。。
</resources>
    其中要注意的一个属性:
    android:ellipsize="marquee"     跑马灯显示文本内容 

    通过以上方式,我们就是实现了TextView实现“跑马灯”式显示长文本,看到这里可能很多朋友会有疑问:既然通过设置android:ellipsize可以实现“跑马灯”效果,为什么还要去写MyTextView这个类呢?

    我们在布局文件中添加一下代码
<TextView
        android:padding="20dp"
        android:singleLine="true"
        android:text="@string/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:focusable="true"
        android:focusableInTouchMode="true"
        android:ellipsize="marquee" />
    其中的一些属性:
    android:focusable="true"     允许获得焦点
    android:focusableInTouchMode="true"    触屏模式下获得焦点

    这里顺便补充一下,TextView只有在获得焦点的情况下才能实现“跑马灯”效果。所以android:focusable="true",android:focusableInTouchMode="true",android:ellipsize="marquee" 这三个属性缺一不可!!!

    实现效果如下:

新增第三行

    可以看到,同样实现了“跑马灯”效果。但是如果我们用同样的方式再添加一个TextView,还会实现一个“跑马灯”效果吗?

    我们再在布局文件中添加一下代码     
<TextView
        android:padding="20dp"
        android:singleLine="true"
        android:text="@string/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:focusable="true"
        android:focusableInTouchMode="true"
        android:ellipsize="marquee" />
    这次的效果:

新增第四行

    可以看到,第四行的TextView并没有滑动,当某一控件获得焦点时,会将其他控件的焦点抢去,这就导致了同一时间只能有一个控件获取焦点。所以我们通过MyTextView这个类重写了父类的isFocused方法,让通过MyTextView实现的TextView控件强制获取焦点,这样就能在有多个TextView的情况下同时实现“跑马灯”效果了!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值