Android之利用TextView实现跑马灯效果

今天,我们将利用TextView控件来实现对一串编辑文字的视觉处理…我们在文本框输的文字多的时候,一般是这个效果这里写图片描述
被分成了两行显示,可是如果布局限制了我们的折行,即只能用单行显示的话,我们该怎么做呢?有人会想到TextView的一个属性 android:singleLine=”true”,我们添加进去试试看,效果是这样的
这里写图片描述
一行显示了,不过多了省略号后面的内容看不到了,显然这个也是不能解决我们问题的方案。下一步我们考虑另一个解决方案,再继续添加属性

android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”— 省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)

我们添加这个属性

    <TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
    android:singleLine="true"
    android:ellipsize="marquee"/>

省略号没了,但是还是没有预期的效果
这里写图片描述
原因在于跑马灯效果需要TextVIew获得当前的焦点(focus)。然而对于TextView这个控件来说,他的默认的Clickable,LongClickable,Focusable,FocusableInTouchMode这四个属性的值都是false,所以跑马灯效果也就不会出来了。为了解决这个问题我们就需要将我们的TextView得到焦点,android:focusable是针对于手机按键有效的,android:focusableInTouchMode是根据屏幕触摸决定的。这里主要涉及android:focusable和android:focusableInTouchMode这两个属性,即把它们都改为true。

    android:focusable="true"
    android:focusableInTouchMode="true"

这里写图片描述
这时出现跑马灯的效果了..不过这样还不算解决问题,因为试一下做两个相同的TextView的话,会发现第一个会动,第二个不会动..
于是采用另一个方案了,我们新建一个文件MarqueeTest.java,让MarqueeTest类继承于TestView,并实现它的三个构造函数和一个isFocused()方法

package com.example.marqueedemo;

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

public class MarqueeTest extends TextView{

    public MarqueeTest(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MarqueeTest(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public MarqueeTest(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean isFocused() {
        // TODO Auto-generated method stub
        return true;  //!!!返回true
    }
}

要实现自定义类的控件,我们就把原来TextView改为我们自定义的TextView,如下

        <com.example.marqueedemo.MarqueeTest
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"/>

        <com.example.marqueedemo.MarqueeTest
        android:id="@+id/textview2"
        android:layout_below="@id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:layout_marginTop="10dp"
        android:focusableInTouchMode="true"/>

这个时候发现就行了,其实关键在于isFocused()方法,第一个TextView默认的已经得到了焦点,焦点在第一个TextView,第二个TextView就拿不到了。而我们自定义的话都能拿到焦点,所以也就都能实现跑马灯的效果了。
这里写图片描述
最后我们来总结一点实现跑马灯效果的步骤
1.在layout里面设置TextView三个属性
2.自定义一个TextView的子类,并实现它的三个构造函数,重载它的isFocused()方法
3.让TextView设为我们自定义的控件(类名+包名)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值