TextView跑马灯的几点问题:

(一)网络上提供的解决办法以及对应的问题

一、TextView的跑马灯效果:

  1. TextView添加属性

    android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:singleLine="true"

    问题:在其他控件获取焦点后,跑马灯动画会停止

二、自定义控件MarqueeTextView,改造TextView跑马灯效果

  1. 改造TextView,重写部分方法

    网络上提供的方法:1、一般是自定义控件MarqueeTextView,继承TextView2、重写isFocused方法3、部分博客上还要求重写onFocusChanged 和onWindowFocusChanged 方法
  2. 代码:

    public class MarqueeTextView extends TextView{    public MarqueeTextView(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);    }    public MarqueeTextView(Context context, AttributeSet attrs)    {        super(context, attrs);    }    public MarqueeTextView(Context context)    {        super(context);    }    @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;    }}

    问题:跑马灯动画会一直运行,但遇到页面有EditText的时候,会和EditText争抢焦点,导致EditText不能弹出键盘,即使手动调用键盘,也不能正常输入。(这个还是很坑的)

三、自定义控件MarqueeTextView,手写跑马灯效果

  1. 开源的项目,是针对上面几种情况,手写的跑马灯效果

    1. https://github.com/sfsheng0322/MarqueeView
    2. https://github.com/gongwen/MarqueeViewLibrary
    3. https://github.com/oubowu/MarqueeLayoutLibrary

    可自定义各种效果,跑动时长,控制动画开停,跑动方向,翻转方向等特性

  2. 自己手写

    略(哈哈哈)

    问题:部分库需要手动开启跑马灯动画,不能根据长度区分是否需要跑马灯。和原生的效果不一样。

(二)我自己的摸索

  1. 需求

    1. 只需要长度不能完全显示的文字有跑马灯动画,长度可以显示的不需要动画
    2. 动画效果和原生的一样就可以:一起启动,一起暂停,原生的速度刚刚好
  2. 研究源码,自定义实现原生的跑马灯效果

    研究源码,根据源码的跑马灯原理:判断长度是否可以全部显示,判断什么时候开始动画,什么时候结束动画,然后发现了一个方法,很有灵感的代码:

    private void startMarquee() {    // Do not ellipsize EditText    if (getKeyListener() != null) return;    if (compressText(getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight())) {        return;    }    if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected())            && getLineCount() == 1 && canMarquee()) {        if (mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {            mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_FADE;            final Layout tmp = mLayout;            mLayout = mSavedMarqueeModeLayout;            mSavedMarqueeModeLayout = tmp;            setHorizontalFadingEdgeEnabled(true);            requestLayout();            invalidate();        }        if (mMarquee == null) mMarquee = new Marquee(this);        mMarquee.start(mMarqueeRepeatLimit);    }}

    重点:isFocused() || isSelected(),在开始跑马灯的时候,做的判断之一就是这个,之前我们重写的时候,会重写isFocused,但焦点很重要,TextView一直持有焦点会造成之前提到的问题,那我们换个思路,重写isSelected,让TextView一直是被选中的,不就可以了吗?!

  3. 经过测试,上述想法可行,于是乎,跑马灯持续动画+与EditText争抢焦点的问题就一次性解决了

解决办法

  1. 改造TextView,重写部分方法

    1、自定义控件MarqueeTextView,继承TextView2、重写isSelected方法
  2. 布局文件中,MarqueeTextView添加属性

    android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:singleLine="true"
  3. 具体代码:

    布局文件:使用自定义控件,添加属性 自定义控件:   @SuppressLint("AppCompatCustomView")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 defStyle) {        super(context, attrs, defStyle);    }    @Override    public boolean isSelected()    {        return true;    }}

    遗留问题:点击EditText弹出键盘和收回键盘,或点击返回按键的时候,跑马灯会回到初始位置,重新开始

后记:其实这个解决办法,改动很小,但探索过程比较长,特记录下来。

更多相关文章

  1. Android中ScrollView嵌套ListView只显示一行的解决方案
  2. 属性大全
  3. Android(安卓)Layout XML属性
  4. [Android实例] Android(安卓)实现导航菜单左右滑动效果
  5. Android(安卓)Spinner控件
  6. [Android]自定义View带效果的滚动数字
  7. Android的布局和Intent笔记和常用实例
  8. Android(安卓)关于嵌套listView时onItemClick事件不响应的解决办
  9. 滑条自动跳转,显示控件的新条目

随机推荐

  1. Android(安卓)读取jar包中assets资源文件
  2. Android 实现沉浸式只需一行代码
  3. [Ubuntu 14.04] 创建可以用于Android的WI
  4. android 4.0后请求网络android.os.Networ
  5. android 工程混淆
  6. (转)Android软件测试的日志文件抓取简介
  7. 我的Android进阶之旅------>Android百度
  8. Android 四大组件(Activity、Service、Br
  9. 新 Android在一个APP中通过包名或类名启
  10. Android 错误集锦(ing...)