Android中走马灯(或跑马灯)以及相关问题总结
前言
Android开发中,应该都或多或少使用过走马灯(或跑马灯)的。
对于走马灯存在的问题,网上很多,我也在这里整(抄)理(袭)一下,方便自己查阅。
总结
由于View的焦点问题,项目中常用[继承TextView实现]这种方式。
至于Android高版本(比如Android 9.0)使用下面方法一和方法二存在耗资源严重问题(走马灯在不断的刷新),因此会考虑自定义View来实现。
由于目前我没有实(抄)现(袭),这里仅仅占个坑位,后续补上。
正文
按照网上说的和我知道的,实现走马灯有三种方式,分别是
- 使用TextView配置实现
- 继承TextView实现(在TextView的基础上,主要解决焦点问题)
- 自定义View实现(主要解决Android高版本CPU占用高问题)
本文也是按照这三个步骤去整理。
使用TextView配置实现
TextView 实现跑马灯效果,需要如下配置(直接摘抄,原文看最后)
- 第一个是要单行显示
- 第二个是单行显示多余部分如何显示,即 ellipsize 属性的设置
- 第三个是获取焦点
- 第四个是走马灯重复次数
- 第五个是强制的获得了焦点,让 View 响应所有的 touch 事件
其实按照上面的还有加一条:
TextView的文本长度要大于TextView的宽度,这样才会有跑马灯的效果
demo代码片段
android:singleLine="true" //只显示一行 android:ellipsize="marquee"// 跑马灯 android:marqueeRepeatLimit="marquee_forever"//重复方式 android:focusableInTouchMode="true" //通过触摸方式获取焦点 android:focusable="true"//获取焦点
优点
Android原生做好的,只需要配置即可
缺点
存在焦点被抢(EditText、ScrollView)导致走马灯无效。
继承TextView实现
由于原生的TextView实现走马灯存在焦点丢失,因此可以继承TextView来强制性获取焦点。
public class MarqueeTextView extends TextView { private boolean isFocused = false; public MarqueeTextView(Context context) { this(context, null); } public MarqueeTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (focused) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } } @Override public void onWindowFocusChanged(boolean hasFocus) { if (hasFocus) super.onWindowFocusChanged(hasFocus); } @Override public boolean isFocused() { return isFocused; } /** * 更新焦点状态,onResume时设置为true,onPause时设置为false * * @param focused */ public void setFocused(boolean focused) { isFocused = focused; return; } }
优点
没有出现走马灯失效问题
缺点
代码量大,需要自定义view,并且需要重写isFocused()方法。
自定义View实
网上比较常用的是继承SurfaceView,我测试过网上的目前网上的效果一般,单一,不流畅等。(如果你又发现好的,麻烦推荐给我哈,多谢)
先占个坑位,后续如果有好的补上。
参考文章
相关文章
暂无评论...