TextView跑马灯的几点问题:持续动画 和 与EditText争抢焦点的问题
TextView跑马灯的几点问题:
(一)网络上提供的解决办法以及对应的问题
一、TextView的跑马灯效果:
TextView添加属性
android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true"
问题:在其他控件获取焦点后,跑马灯动画会停止
二、自定义控件MarqueeTextView,改造TextView跑马灯效果
改造TextView,重写部分方法
网络上提供的方法: 1、一般是自定义控件MarqueeTextView,继承TextView 2、重写isFocused方法 3、部分博客上还要求重写onFocusChanged 和onWindowFocusChanged 方法
代码:
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,手写跑马灯效果
开源的项目,是针对上面几种情况,手写的跑马灯效果
- https://github.com/sfsheng0322/MarqueeView
- https://github.com/gongwen/MarqueeViewLibrary
- https://github.com/oubowu/MarqueeLayoutLibrary
可自定义各种效果,跑动时长,控制动画开停,跑动方向,翻转方向等特性
自己手写
略(哈哈哈)
问题:部分库需要手动开启跑马灯动画,不能根据长度区分是否需要跑马灯。和原生的效果不一样。
(二)我自己的摸索
需求
- 只需要长度不能完全显示的文字有跑马灯动画,长度可以显示的不需要动画
- 动画效果和原生的一样就可以:一起启动,一起暂停,原生的速度刚刚好
研究源码,自定义实现原生的跑马灯效果
研究源码,根据源码的跑马灯原理:判断长度是否可以全部显示,判断什么时候开始动画,什么时候结束动画,然后发现了一个方法,很有灵感的代码:
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一直是被选中的,不就可以了吗?!
经过测试,上述想法可行,于是乎,跑马灯持续动画+与EditText争抢焦点的问题就一次性解决了
解决办法
改造TextView,重写部分方法
1、自定义控件MarqueeTextView,继承TextView 2、重写isSelected方法
布局文件中,MarqueeTextView添加属性
android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true"
具体代码:
布局文件:使用自定义控件,添加属性 <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争抢焦点的问题相关推荐
- Android TextView跑马灯效果与设置文字阴影
TextView跑马灯效果的实现 自定义 一个TextView public class MusicDesText extends TextView {public MusicDesText(Cont ...
- 【Android】不依赖焦点和选中的TextView跑马灯
前言 继承TextView,并仿照源码修改而来,主要是取消了焦点和选中了判断,也不依赖文本的宽度. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民 ...
- 关于有多个Fragment中的textview跑马灯问题
====================问题描述==================== 一个activity里面有多个Fragment,1,2,3,4 其中fragment1中有2个textview ...
- TextView跑马灯效果
转载:http://www.2cto.com/kf/201409/330658.html 一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 androi ...
- Android TextView跑马灯不动 及属性
<TextView android:text="每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure().onLayout()和onDraw(),"andro ...
- android 文字滚动组件,Android textview 跑马灯文字滚动效果
设置如下TextView控件文件的XML: android:id="@+id/textview" android:layout_width="match_parent&q ...
- Android:TextView 自动滚动(跑马灯) (转)
Android:TextView 自动滚动(跑马灯) TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true" ...
- Android TextView文字横向自动滚动(跑马灯)
TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true" 2.设置可滚到,或显示样式:android:elli ...
- Android TextView中划线、下划线、跑马灯的简单使用
本人安卓初学者,小白一枚,希望以写博客的方法巩固已学的技能,讲的可能不好,望大家见谅! 不墨迹 直接上 效果图 TextView 中划线 和 下划线 xml文件中(中划线和下划线一样 有个 id 就行 ...
- Android自定义不需要焦点的TextView以实现跑马灯效果
使用原生的TextView实现"跑马灯"效果,需要特别注意其是否获取到了焦点(特别是程序当中有多个需要赋值的 Textview或进度条之类的需要改变其值的View);TextVie ...
最新文章
- Attention注意力机制的前世今身
- OpenCV霍夫变换的演示代码(附完整代码)
- Android开发五 Android应用程序架构
- step4 . day1标准IO和文件IO
- 先容Oracle中null的运用要领。
- Linux文件系统管理命令(第二版)
- 网络工程师交换试验手册之二十五:详细讲授利用xmodem来恢复IOS
- php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
- 《DSP using MATLAB》示例Example4.2
- 用JavaScript校验日期的合法性
- 老毛子固件相关内容!
- 元器件保护必备知识——静电防护
- 考研和计算机三级,考研考计算机与考软件有什么区别吗
- 【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度
- 使用 SHAP库 对模型预测作解释
- 【Destory后依然占用内存】
- pytorch的transform中ToTensor接着Normalize
- icheck 动态设置选中,判断是否选择
- 计算机系统基础期末复习--袁春风详细版
- 达梦数据库安装方法以及注意事项