如何在 TextView 中无限滚动长文本

How to scroll long text in TextView indefinitely

当文本太长时,我想无限期地为我的 TextView 设置动画。我找到了一些解决方案,但它会在 2 秒后重置回到文本的开头,即使仍然需要滚动一些文本。我需要无限的动画,它应该滚动整个文本,最后会出现文本的开头。 就像火车站的那些信息板一样。

这是我现在的动画:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="100"
    android:interpolator="@android:anim/linear_interpolator"
    android:repeatCount="infinite"
    android:toXDelta="-100" />

有重复计数,但我不想重复动画并重置到初始位置,而是一直动画。

您不需要动画,一个简单的 Marquee TextView 即可:

<TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:text="Your Sample text here" />

确保您设置了选取框模式(在上述 ellipsize 属性中)并将最大行数设置为 1 以使其正常工作。您可以通过将 marquee_forever 替换为整数来选择无限期或特定次数地重复它。

如果您需要停止重复模式并在初始点设置视图,那么您可以将计数设置为-1。

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="100"
    android:interpolator="@android:anim/linear_interpolator"
    android:repeatCount="-1"
    android:toXDelta="-100" />

如果需要,您可以将repeatmode设置为Animation.REVERSE

需要动态做的可以用下面的方式

   mScanner.setVisibility(View.VISIBLE);
   mAnimation = new TranslateAnimation(
            TranslateAnimation.ABSOLUTE, 0f,
            TranslateAnimation.ABSOLUTE, 0f,
            TranslateAnimation.RELATIVE_TO_PARENT, 0f,
            TranslateAnimation.RELATIVE_TO_PARENT, 1.0f);
   mAnimation.setDuration(10000);
   mAnimation.setRepeatCount(-1);
   mAnimation.setRepeatMode(Animation.REVERSE);
   mAnimation.setInterpolator(new LinearInterpolator());
   mScanner.setAnimation(mAnimation);

你可以试试这个:

<TextView
       android:id="@+id/rv_item_tv_address"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_margin="10dp"
       android:ellipsize="marquee"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:gravity="center"
       android:marqueeRepeatLimit="marquee_forever"
       android:scrollHorizontally="true"
       android:singleLine="true"
       android:text="address"
       android:textColor="@color/colorPrimary"
       android:textSize="20sp"
      />