美文网首页Android
实现跑马灯效果的 TextView

实现跑马灯效果的 TextView

作者: 笔头还没烂 | 来源:发表于2023-02-16 14:19 被阅读0次
    1. 说明:要想实现跑马灯效果的 TextView,主要是实现下面这5个属性:

      (1)android:singleLine: 内容单行显示

      (2)android:focusable: 是否可以获取焦点

      (3)android:focusableInTouchMode: 用于控制视图在触摸模式下是否可以聚焦

      (4)android:ellipsize: 在哪里省略文本

      (5)android:marqueeRepeatLimit: 字幕动画重复的次数

    2. 准备工作:

      (1)需要先准备一行较长的文本,内容自定义。

      (2)设置 textView 的宽度跟它的父视图的宽度一致。

    3. 实现代码如下:

      <TextView
              android:id="@+id/tv_one"
              android:text="@string/tv_one_text"
              android:textColor="@color/black"
              android:textStyle="normal"
              android:textSize="40sp"
              android:gravity="center"
              android:shadowColor="@color/red"
              android:shadowRadius="10.0"
              android:shadowDx="50.0"
              android:shadowDy="30.0"
              android:singleLine="true"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:ellipsize="marquee"
              android:marqueeRepeatLimit="marquee_forever"
              android:layout_width="match_parent"
              android:layout_height="200dp"></TextView>
      

      · singleLine 决定 TextView 的内容以一行的方式显示

      · ellipsize: 设置 textView 在哪里省略文本,这里有几个选项,如下所示:

      //默认是 end,在文本的结尾处显示省略号。但是要想实现跑马灯的效果,这里需要选择 marquee.
      <attr name="ellipsize">
              <enum name="none" value="0" />
              <enum name="start" value="1" />
              <enum name="middle" value="2" />
              <enum name="end" value="3" />
              <enum name="marquee" value="4" />
          </attr>
      

      · marqueeRepeatLimit:选择跑马灯重复的次数,这里选择 marquee_forever

      · focusable、focusableInTouchMode 设置 textView 是否可以获取焦点

      但是我们发现,这样设置之后,代码跑起来还是看不到跑马灯的效果。原因是 textView 获取不到焦点。这里有几种解决方式:

      方法一:我们可以再加一个 clickable 属性,代码如下所示:

      <TextView
              android:id="@+id/tv_one"
              android:text="@string/tv_one_text"
              android:textColor="@color/black"
              android:textStyle="normal"
              android:textSize="40sp"
              android:gravity="center"
              android:shadowColor="@color/red"
              android:shadowRadius="10.0"
              android:shadowDx="50.0"
              android:shadowDy="30.0"
              android:singleLine="true"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:ellipsize="marquee"
              android:clickable="true"
              android:marqueeRepeatLimit="marquee_forever"
              android:layout_width="match_parent"
              android:layout_height="200dp"></TextView>
      

      方法二:自定义一个 TextView。

      (1)新建一个自定义类,类名为 MyTextView,并重写它的 isFocused() 方法。代码如下所示:

      package com.example.myapplication;
      
      import android.content.Context;
      import android.util.AttributeSet;
      import android.widget.TextView;
      import androidx.annotation.Nullable;
      public class MyTextView extends TextView {
          public MyTextView(Context context) {
              super(context);
          }
      
          public MyTextView(Context context, @Nullable AttributeSet attrs) {
              super(context, attrs);
          }
      
          public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
              super(context, attrs, defStyleAttr);
          }
      
          @Override
          public boolean isFocused() {
              return true;
          }
      }
      

      (2)在 activity_main.xml 中将原有的 TextView 替换成自己自定义的 MyTextView 类,代码如下所示:

      <com.example.myapplication.MyTextView
              android:id="@+id/tv_one"
              android:text="@string/tv_one_text"
              android:textColor="@color/black"
              android:textStyle="normal"
              android:textSize="40sp"
              android:gravity="center"
              android:shadowColor="@color/red"
              android:shadowRadius="10.0"
              android:shadowDx="50.0"
              android:shadowDy="30.0"
              android:singleLine="true"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:ellipsize="marquee"
              android:clickable="true"
              android:marqueeRepeatLimit="marquee_forever"
              android:layout_width="match_parent"
              android:layout_height="200dp"></com.example.myapplication.MyTextView>
      

      (3)至此,我们重新运行代码。可以看到,代码一运行,跑马灯就自动跑起来了。

      方法三:还是用回原来的 TextView,在 TextView 的代码中加入 <requestFocus />,代码如下:

      <TextView
              android:id="@+id/tv_one"
              android:text="@string/tv_one_text"
              android:textColor="@color/black"
              android:textStyle="normal"
              android:textSize="40sp"
              android:gravity="center"
              android:shadowColor="@color/red"
              android:shadowRadius="10.0"
              android:shadowDx="50.0"
              android:shadowDy="30.0"
              android:singleLine="true"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:ellipsize="marquee"
              android:clickable="true"
              android:marqueeRepeatLimit="marquee_forever"
              android:layout_width="match_parent"
              android:layout_height="200dp">
              <requestFocus />
          </TextView>
      

      这样,代码跑起来同样也会有跑马灯的效果。

    以上,感谢阅读!

    相关文章

      网友评论

        本文标题:实现跑马灯效果的 TextView

        本文链接:https://www.haomeiwen.com/subject/igypkdtx.html