Android的TextView支持跑马灯模式,对于显示一些单行长字符串还是不错的,可惜的是TextView要想显示跑马灯模式,必须要设置两个属性focusableInTouchMode=”true”,focusable=”true”,于是问题来了,如果我要在一个界面同时显示两个或两个以上跑马灯呢?

老规矩,在节目开始之前,先来一个搞笑段子:
男孩终于鼓足勇气去向女孩告白:“我喜欢你很久了,你能做我的女朋友吗?”
女孩说:“对不起,我不能喜欢你,因为我有男朋友了。”
男孩失落地转身离去,泪水不住地往下流。
刚走不远,身后传来女孩急切的声音:“你等一下!”
男孩破涕为笑,满怀期待地回头。
女孩说:“就算我没有男朋友,也不会喜欢你的。”

这两个属性不能同时对多个控件生效,所以就不能实现。
于是就有很多小伙伴开始自定义view,自己绘制、做动画、转换等,这是正途,对于系统控件不能满足的需求,我们确实应该优先想到自定义,但是对于这个case,有一个更加简单的方法。

利用一个小技巧骗过系统的判断,也可以说是一个小BUG吧。
系统判断一个TextView有没有获得焦点,是通过isFocused()方法,但是如果两个或两个以上TextView都设置了上面的两个属性,只有一个isFocused()能返回true,这就是为什么我们不能实现多个多个TextView同时显示跑马灯的原因。

于是,方法来了:我们重写TextView的isFocused()方法,强制返回true。

public class MarqueeTextView extends TextView {    public MarqueeTextView(Context context) {        this(context, null);    }    public MarqueeTextView(Context context, AttributeSet attrs) {        super(context, attrs);        setFocusable(true);        setFocusableInTouchMode(true);        setSingleLine();        setEllipsize(TruncateAt.MARQUEE);        setMarqueeRepeatLimit(-1);    }    public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        setFocusable(true);        setFocusableInTouchMode(true);        setSingleLine();        setEllipsize(TruncateAt.MARQUEE);        setMarqueeRepeatLimit(-1);    }    @Override    protected void onFocusChanged(boolean focused, int direction,            Rect previouslyFocusedRect) {        if (focused) {            super.onFocusChanged(focused, direction, previouslyFocusedRect);        }    }    @Override    public void onWindowFocusChanged(boolean focused) {        if (focused) {            super.onWindowFocusChanged(focused);        }    }    @Override    public boolean isFocused() {        return true;    }}

这样,系统就会认为所有的TextView的isFocused()都是true,就可以实现多个跑马灯的效果。

对于这种方法,我只想说:真是机智啊!!!

好了,本期节目就到这里,感谢大家的收看,下期再见~

更多相关文章

  1. Android(安卓)Fragment使用
  2. Android(安卓)UI 单线程模型的编程原则以及AsyncTask原理
  3. Android开发两个例子:多点触控技术&桌面快捷方式
  4. 深入浅析Android消息机制
  5. Android(安卓)小项目之--数据存储【Files】(附源码)
  6. Android中使用Handler&Looper更新UI范例
  7. Android(安卓)html5和Android之间的交互
  8. android studio导入其他项目工程报错解决方法
  9. 在SQL数据库保存数据

随机推荐

  1. Android——实现渐变色水波纹效果源码
  2. Android(安卓)数据库事务处理
  3. Android(安卓)检测系统通知栏开关是否打
  4. Android(安卓)EditText的设置
  5. 不同Activity之间传递数据--Bundle对象和
  6. Android(安卓)Canvas笔记
  7. 【安卓开发学习】6.ListView点击事…
  8. Android移植oprofile性能监测工具
  9. Real6410 Android(安卓)2.1 的 SDIO WiFi
  10. Ubuntu 环境下Android-NDK独立工具链安装