Android中走马灯(或跑马灯)以及相关问题总结

Android 1年前 (2021) 125la.com站长
168 0 0
广告也精彩

前言

Android开发中,应该都或多或少使用过走马灯(或跑马灯)的。

对于走马灯存在的问题,网上很多,我也在这里整(抄)理(袭)一下,方便自己查阅。

总结

由于View的焦点问题,项目中常用[继承TextView实现]这种方式。

至于Android高版本(比如Android 9.0)使用下面方法一和方法二存在耗资源严重问题(走马灯在不断的刷新),因此会考虑自定义View来实现。

由于目前我没有实(抄)现(袭),这里仅仅占个坑位,后续补上。

正文

按照网上说的和我知道的,实现走马灯有三种方式,分别是

  1. 使用TextView配置实现
  2. 继承TextView实现(在TextView的基础上,主要解决焦点问题)
  3. 自定义View实现(主要解决Android高版本CPU占用高问题)

本文也是按照这三个步骤去整理。

使用TextView配置实现

TextView 实现跑马灯效果,需要如下配置(直接摘抄,原文看最后)

  1. 第一个是要单行显示
  2. 第二个是单行显示多余部分如何显示,即 ellipsize 属性的设置
  3. 第三个是获取焦点
  4. 第四个是走马灯重复次数
  5. 第五个是强制的获得了焦点,让 View 响应所有的 touch 事件

其实按照上面的还有加一条:

TextView的文本长度要大于TextView的宽度,这样才会有跑马灯的效果

demo代码片段

    android:singleLine="true" //只显示一行
    android:ellipsize="marquee"// 跑马灯
    android:marqueeRepeatLimit="marquee_forever"//重复方式
    android:focusableInTouchMode="true" //通过触摸方式获取焦点
    android:focusable="true"//获取焦点
优点

Android原生做好的,只需要配置即可

缺点

存在焦点被抢(EditTextScrollView)导致走马灯无效。

继承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,我测试过网上的目前网上的效果一般,单一,不流畅等。(如果你又发现好的,麻烦推荐给我哈,多谢)

先占个坑位,后续如果有好的补上。

参考文章

  1. Android之跑马灯详解
  2. Android中实现跑马灯效果

广告也精彩
版权声明:125la.com站长 发表于 2021年4月2日 下午12:12。
转载请注明:Android中走马灯(或跑马灯)以及相关问题总结 | 125啦读书导航

相关文章

广告也精彩

暂无评论

暂无评论...