如何让TextView中的文字水平滚动

2017-12-27 12:51:14

其实让一段文字水平滚动,并不复杂。我们只需要在布局文件中加上几个参数就可以了,如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/textView1"
        android:text="@string/long_value"
        android:layout_width="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:textSize="10dp"
        android:layout_height="wrap_content" />

</LinearLayout>

但是问题是,如果我们想在加一个textview,把布局文件变成

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/textView1"
        android:text="@string/long_value"
        android:layout_width="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:textSize="10dp"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView2"
        android:text="@string/long_value"
        android:layout_width="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:textSize="10dp"
        android:layout_height="wrap_content" />

</LinearLayout>

运行的时候发现只有一个textview是水平滚动的,那如果我们想要让它们两个都滚动的话,那么我们只能使用自定义的textView控件了

新建MarqueeText.java文件,内容为

package com.example.nosay.myapplication;

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


/**
 * Created by nosay on 12/27/17.
 */

public class MarqueeText extends android.support.v7.widget.AppCompatTextView {


    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);
    }

    @Override
    public boolean isFocused() {
        return true;
    }
}

相应的布局文件改为

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.example.nosay.myapplication.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:singleLine="true"
        android:text="@string/long_value" />

    <com.example.nosay.myapplication.MarqueeText
        android:id="@+id/textView2"
        android:layout_below="@id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:singleLine="true"
        android:layout_marginTop="20dp"
        android:text="@string/long_value" />

</LinearLayout>

再运行,实现两行文件的水平滚动效果。