zoukankan      html  css  js  c++  java
  • Android学习总结——TextView跑马灯效果

    Android系统中TextView实现跑马灯效果,必须具备以下几个条件:

    1、android:ellipsize=”marquee”
    2、TextView必须单行显示,即内容必须超出TextView大小
    3、TextView要获得焦点才能滚动
     
    实现代码:

    xml:

    android:singleLine="true" //单行显示
    android:ellipsize="marquee" //跑马灯显示(动画横向移动)
    android:marqueeRepeatLimit="marquee_forever"//永久滚动
    android:focusable="true" //控件是否能够获取焦点
    android:focusableInTouchMode="true" //是否在触摸模式下获得焦点

       当我们需要多个TextView实现跑马灯效果时,上面的方法就不管用了,因为它获取不到焦点了。所以就需要自定义一个TextView,继承TextView,并且重写isFocuse()方法,让它永远返回true,这样跑马灯效果就能一直的跑起来了。

    package com.example.music.marquee;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    /**
     * Created by xch on 2016/10/25.
     */
    
    public class MarqueeTextView extends TextView {
        public MarqueeTextView(Context context) {
            super(context);
        }
    
        public MarqueeTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean isFocused() {
            return true;
        }
    }

     

     接下来布局文件中使用自定义的TextView就好。具体写法就是:包名.自定义TextView

    <com.example.music.marquee.MarqueeTextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:singleLine="true"
      android:ellipsize="marquee"
      android:marqueeRepeatLimit="marquee_forever"
      android:focusable="true"
      android:focusableInTouchMode="true" />

    补充:

    1.android:ellipsize属性:

    android:ellipsize="start"              省略号在开头 
    android:ellipsize="middle"           省略号在中间 
    android:ellipsize="end"                省略号在结尾 
    android:ellipsize="marquee"        跑马灯显示

    2.在Android Studio中,TextView单行显示:singleline语句已废弃不推荐使用,可以替换为 maxLines="1",but我换了之后跑马灯无法实现,下面来看看这两个属性的区别:

        从字面意思理解,这两个都是限制Text的行数。那么singleLine="true" 和maxLine="1" 都是限制为一行,but,maxLines 是在限制高度, singleLine 是强制不让换行。从高度来讲是一样的,两者肯定都显示一行,但从换行的位置来讲就有区别了,maxLines并不会改变其换行的位置,而singleLine则会。从这个角度讲,singleLine的显示会好一些,因为如果超过一行singleLine会在一行内显示,后面加上"...",而maxlines="1" 则不会,它依然会在原来换行的位置换行,所以有时候一行不满,但是却不显示剩下的部分。

        网上查资料之后,可能是maxLine与ellipsize配合失效。对于这个问题,我这里显示一行就暂时用singleLine="true"代替吧。

    顺便贴上网上的一些解决办法参考:http://blog.csdn.net/itchenlin/article/details/50386396

                                                       http://blog.csdn.net/womengmengyan/article/details/52136054 

                                               http://blog.csdn.net/true100/article/details/43965311

                                               http://blog.csdn.net/fengkuanghun/article/details/8351149

                                                        http://ck19860613.iteye.com/blog/1116858

  • 相关阅读:
    四十八.监控概述 、 Zabbix基础 、 Zabbix监控服务
    123D
    bzoj3879
    bzoj1699
    LA6878
    uoj#149
    687C
    codeforces round #424 div2
    803E
    713C
  • 原文地址:https://www.cnblogs.com/xch-yang/p/5996842.html
Copyright © 2011-2022 走看看