用几行代码做一个十分简单的无限循环播放的走马灯例子

时间:2020-12-10 06:01:01

这次来跟大家分享一下用用几行代码做一个十分简单的无限循环播放的走马灯例子。

运行效果如下:

用几行代码做一个十分简单的无限循环播放的走马灯例子

其实这个例子也十分的简单。大部分代码只要在xml中对TextView里面修改或添加几项属性就能完成。

首先我们来看一下 xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.marqueetextviewdemo.MainActivity">

    <TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusableInTouchMode="true"
        android:singleLine="true"
        android:text="这是一个走马灯效果TextView这是一个走马灯效果TextView这是一个走马灯效果TextView"
        android:textSize="20sp" />


</RelativeLayout>

我们看到如上的代码,其实如果你只想要实现“会走的文字”这个效果的话只需要在TextVIew中用上几个它的属性便能实现。

我们来看一下几个属性,其中哪些对于“走马灯”是必须的:

android:singleLine="true" //当行显示,如果不适用,在TextView多出屏幕宽的文字就会换行,(必须)

android:ellipsize="marquee" //走马灯效果,配合下面的属性一起添加后文字可以实现滚动(必须)

android:focusableInTouchMode="true"//这个属性的意思一如字面所述,就是在进入触摸输入模式后,该控件是否还有获得焦点的能力.


到这里为止我们已经基本的能实现一个“走马灯”的效果了,但这样远远是不够的,因为当你发现你用上述方法锁生产出来的走马灯过一段时间就不能运作。那是因为你还没设置好这个走马灯的运作时长。加上android:marqueeRepeatLimit="marquee_forever" //直马灯效果的时间(必须)。这样就可以了。而界面中多添加一些其他的控件的时候你会发现,若是被其他控件获得焦点或是有多个走马灯在运行的时候,那么其中一个也会停止运作。其实那是控件之间在夺取焦点的原因。

而正常状态下获取的焦点也就只有一个,一个走马灯获取了另一个则会停下。

所以我们来自定义一个控件来强行获取焦点。这样走马灯的效果也就基本完成了。

public class MarqueeText extends TextView {
    public MarqueeText(Context context) {
        super(context);
    }

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

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

    //这里把自定义空间中的获取焦点属性设置为true那么该空间就会一直获取到焦点,而焦点不会走掉到别的控件上
    @Override
    public boolean isFocused() {
        return true;
    }
}

最终有两个走马灯的xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.marqueetextviewdemo.MainActivity">

    <com.marqueetextviewdemo.MarqueeText
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="这是一个走马灯效果TextView这是一个走马灯效果TextView这是一个走马灯效果TextView"
        android:textSize="20sp" />


    <com.marqueetextviewdemo.MarqueeText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textview1"
        android:layout_marginTop="10dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="这是一个走马灯效果TextView这是一个走马灯效果TextView这是一个走马灯效果TextView"
        android:textSize="20sp" />


</RelativeLayout>


看完后是不是很简单呢?没试过的朋友可以试下。代码放在下面,想要的同学可以下载。如果有不明或是改进的意见指出错误等也可以提出,欢迎交流共同进步。

代码下载