实现文本动态,走马灯
单行显示:
android:singleLine="true"显示走马灯: android:ellipsize="marquee"
获得焦点: android:focusable="true"
强制获得焦点:android:focusableInTouchMode="true"
走马灯的模式:android:marqueeRepeatLimit="marquee_forever"
- 为实现获多个焦点,我们用代码来生成跑马灯
- 1.创建一个类去继承TextView
- 2.生成一个参数和两个参数的构造器,让一个参数构造器来指向第二个参数
- 3.重写isFocused方法来欺骗系统实现多个跑马灯
public class FocusedTextView extends TextView{
//一般传入两个参数
public FocusedTextView(Context context) {
this(context,null);
}
//布局到xml中使用
public FocusedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// 单行显示: android:singleLine="true"
setSingleLine(true);
// 显示走马灯: android:ellipsize="marquee"
setEllipsize(TruncateAt.MARQUEE);
// 获得焦点: android:focusable="true"
setFocusable(true);
// 强制获得焦点:android:focusableInTouchMode="true"
setFocusableInTouchMode(true);
// 走马灯的模式:android:marqueeRepeatLimit="marquee_forever"
setMarqueeRepeatLimit(-1);//-1表示一直动
}
//系统默认的是只有一个焦点,只能实现一个走马灯,我们可以重写他的方法来欺骗系统
@Override
public boolean isFocused() {
return true;
}
//在一个window中的多个view中
//当其他编辑文本,或者对话框抢占焦点,为了让跑马灯继续跑起来,我们需要重写方法
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
//我让他为true时才走这个构造方法,这样他就不会改变状态
if(focused){
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
//在多个windows中,任然有焦点,重写方法
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if(hasWindowFocus){
super.onWindowFocusChanged(hasWindowFocus);
}
}
}
焦点:是一种标记focusable:在一个window中只有一个view可以有焦点,flag---可以运行或者不运行enable:可用与不可用selected:选中或不选中焦点应用到文件中,设置两个文本走马灯欺骗系统来实现走马灯 可能会出现的问题:有时候显示文字没有走动?显示跑马灯效果的前提条件就是你的文本内容要比显示文本的外部组件长,即外部组件无法完整的显示内部的文本内容。
因此要实现跑马灯效果有两种设置方式:
1、layout_width=”"设置为成比文本内容短的固定值,最好不要写成wrap_content或者fill_parent。
2、如果layout_width=”"设置wrap_content或者fill_parent,那么可以增加上 padding的值使两端的距离加大而无法全部显示文本内容,但是这有一个缺陷就是在手机的屏幕变大时,距离没有变大,外部组件又可以正常显示内部文本,于是又无法显示跑马灯效果,因此建议第一种设置为佳。