android原生TextView怎么控制是否开始跑走马灯

在实际项目中,经常遇到文本超出控件宽度,显示不全,此时android提供了一个方法:

   void android.widget.TextView.setEllipsize(TruncateAt where)  

   此方法意思就是设置文本超出宽度的展示效果。TruncateAt定义如下:


  public static enum TruncateAt {
        END,
        MARQUEE,
        MIDDLE,
        START;

        private TruncateAt() {
        }
    }
   END: 表示在文本展示不全时候,在文本末尾显示省略号

   MARQUEE: 表示在文本展示不全时候,以走马灯形式滚动

   MIDDLE:表示在文本展示不全时候,在文本中间尾显示省略号

   START:表示在文本展示不全时候,在文本开始处显示省略号

  默认不设置,表示无以上效果。超出控件部分文字会被截断显示。

  所以,可以使用null关闭ellipsize。即:

  setEllipsize(null);

另外,以上属性设置是立即生效的。即如果文本是MARQUEEN,走马灯滚动状态, 
如果设置为null时候,在滚动的走马灯马上会回到初始状态。且文本被截断。
如果设置为END,在滚动的走马灯会回到末尾有省略号的样式。  
控制走马灯滚动可以如下设置:
   // 开始滚动
    public void startScroll() {
        setEllipsize(TextUtils.TruncateAt.MARQUEE);
    }
    // 停止滚动,回到起点
    public void stopScroll() {
        setEllipsize(TextUtils.TruncateAt.END);或者setEllipsize(null);
    }



android样进行走马灯滚动前提是该控件在焦点状态,且可以聚焦。但是很多时候文本不聚焦也需要滚动提示用户。
如果不自定义view,那么android系统的TextView怎么样才能达到效果呢?
答案就是复写TextView的isFocused方法:
   //默认滚动
    @Override
    public boolean isFocused() {
        return true;
    }

  

另外,setSingleLine()或setHorizontallyScrolling(bool)来限制为单行文本。
如果setMaxLines(int)被用来设置两行或两行以上的文本,只有END和MARQUEE被ellipsize方法支持(其他ellipsiz类型将不会做任何事情)。

示列:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
        >
    <com.starcor.hunan.MarqueeTextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:scrollHorizontally="true"
            android:layout_centerInParent="true"
            android:singleLine="true"
            android:textColor="#ff0000"
            android:focusable="true"
            android:textSize="24px"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusableInTouchMode="true"/>
</FrameLayout>


public class MarqueeTextView extends TextView{

    public MarqueeTextView(Context context) {
        super(context);
    }

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

    public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        this.setScrollbarFadingEnabled(true);
        this.setHorizontallyScrolling(true);
        this.setHorizontalFadingEdgeEnabled(true);
        this.setSingleLine(true);
        this.setFocusable(true);
        this.setMarqueeRepeatLimit(-1);
        this.setMaxLines(1);
    }

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值