您的位置:首页 > 移动开发 > Android开发

Android学习总结——TextView跑马灯效果

2016-10-25 16:45 246 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: