TextView跑马灯的几点问题:

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

一、TextView的跑马灯效果:

  1. TextView添加属性

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

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

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

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

    网络上提供的方法:
    1、一般是自定义控件MarqueeTextView,继承TextView
    2、重写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);}@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect){if (focused)super.onFocusChanged(focused, direction, previouslyFocusedRect);}@Overridepublic void onWindowFocusChanged(boolean focused){if (focused)super.onWindowFocusChanged(focused);}@Overridepublic 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 EditTextif (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,继承TextView
    2、重写isSelected方法
    
  2. 布局文件中,MarqueeTextView添加属性

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

    布局文件:使用自定义控件,添加属性
    <com.xxxx.xxxx.ui.widget.MarqueeTextViewandroid:id="@+id/user_name"android:layout_width="match_parent"android:layout_height="50dp"android:singleLine="true"android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:text="超长的文字测试1超长的文字测试2超长的文字测试3超长的文字测试4超长的文字测试5超长的文字测试6超长的文字测试7超长的文字测试8"
    /> 自定义控件:
    @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);}@Overridepublic boolean isSelected(){return true;}
    }
    

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

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

TextView跑马灯的几点问题:持续动画 和 与EditText争抢焦点的问题相关推荐

  1. Android TextView跑马灯效果与设置文字阴影

    TextView跑马灯效果的实现 自定义 一个TextView public class MusicDesText extends TextView {public MusicDesText(Cont ...

  2. 【Android】不依赖焦点和选中的TextView跑马灯

    前言 继承TextView,并仿照源码修改而来,主要是取消了焦点和选中了判断,也不依赖文本的宽度. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民 ...

  3. 关于有多个Fragment中的textview跑马灯问题

    ====================问题描述==================== 一个activity里面有多个Fragment,1,2,3,4 其中fragment1中有2个textview ...

  4. TextView跑马灯效果

    转载:http://www.2cto.com/kf/201409/330658.html 一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 androi ...

  5. Android TextView跑马灯不动 及属性

    <TextView android:text="每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure().onLayout()和onDraw(),"andro ...

  6. android 文字滚动组件,Android textview 跑马灯文字滚动效果

    设置如下TextView控件文件的XML: android:id="@+id/textview" android:layout_width="match_parent&q ...

  7. Android:TextView 自动滚动(跑马灯) (转)

    Android:TextView 自动滚动(跑马灯) TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true" ...

  8. Android TextView文字横向自动滚动(跑马灯)

    TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true" 2.设置可滚到,或显示样式:android:elli ...

  9. Android TextView中划线、下划线、跑马灯的简单使用

    本人安卓初学者,小白一枚,希望以写博客的方法巩固已学的技能,讲的可能不好,望大家见谅! 不墨迹 直接上 效果图 TextView 中划线 和 下划线 xml文件中(中划线和下划线一样 有个 id 就行 ...

  10. Android自定义不需要焦点的TextView以实现跑马灯效果

    使用原生的TextView实现"跑马灯"效果,需要特别注意其是否获取到了焦点(特别是程序当中有多个需要赋值的 Textview或进度条之类的需要改变其值的View);TextVie ...

最新文章

  1. Attention注意力机制的前世今身
  2. OpenCV霍夫变换的演示代码(附完整代码)
  3. Android开发五 Android应用程序架构
  4. step4 . day1标准IO和文件IO
  5. 先容Oracle中null的运用要领。
  6. Linux文件系统管理命令(第二版)
  7. 网络工程师交换试验手册之二十五:详细讲授利用xmodem来恢复IOS
  8. php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
  9. 《DSP using MATLAB》示例Example4.2
  10. 用JavaScript校验日期的合法性
  11. 老毛子固件相关内容!
  12. 元器件保护必备知识——静电防护
  13. 考研和计算机三级,考研考计算机与考软件有什么区别吗
  14. 【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度
  15. 使用 SHAP库 对模型预测作解释
  16. 【Destory后依然占用内存】
  17. pytorch的transform中ToTensor接着Normalize
  18. icheck 动态设置选中,判断是否选择
  19. 计算机系统基础期末复习--袁春风详细版
  20. 达梦数据库安装方法以及注意事项

热门文章

  1. linux进程作业号,Linux系统进程管理及作业操作
  2. TCP数据报结构以及三次握手(图解)
  3. 学生学籍管理系统源码
  4. C语言学习资料和视频
  5. 小型网站项目完整部署流程(Windows操作系统)
  6. 车牌识别opencv_基于OpenCV 的车牌识别
  7. nokia 5220 XpressMusic 自己刷机
  8. 解决Android Studio Import Sample网络连接失败问题
  9. Java贪吃蛇小游戏,我家小AD从小水蛇成长为水中巨蟒!
  10. android移动应用基础教程源代码,《Android移动应用基础教程》之Android购物商城