前言

Android 里 TextView 控件本身就带有跑马灯的效果,但会存在 EditText 和 Dialog 抢占焦距使跑马灯效果失效等问题。

1 TextView 实现跑马灯效果

用 TextView 实现跑马灯效果,只需关注5个属性:

  1. 单行显示
  2. 单行显示多余部分如何显示,即 ellipsize 属性的设置
  3. 获取焦点
  4. 跑马灯重复次数
  5. 强制的获得了焦点,让 View 响应所有的 touch 事件
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="@dimen/dp_10"android:background="@android:color/holo_green_light"android:singleLine="true"android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:focusable="true"android:focusableInTouchMode="true"android:text="Always believe that something wonderful is about to happen adsa"/>

效果图:

表面上看起来没什么问题,实际上存在很多问题

2 TextView 实现跑马灯之问题

2.1 问题一

页面上出现两个跑马灯效果时

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_green_light"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:padding="@dimen/dp_10"android:singleLine="true"android:text="Always believe that something wonderful is about to happen adsa" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="@dimen/dp_10"android:background="@android:color/holo_green_light"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:padding="@dimen/dp_10"android:singleLine="true"android:text="Always believe that something wonderful is about to happen adsa" />

效果图:

问题:会发现一个问题,只有第一个 TextView 会有走马灯的效果
原因:第一个 TextView 抢占了焦距
解决方法:自定义 TextView 来实现跑马灯

2.2 自定义 TextView

public class MarqueeTextView extends android.support.v7.widget.AppCompatTextView {public MarqueeTextView(Context context) {this(context, null);}public MarqueeTextView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public MarqueeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// 设置单行setSingleLine();
//        setMaxLines(1);//设置 Ellipsize,setMaxLines(1) 和 setEllipsize 冲突setEllipsize(TextUtils.TruncateAt.MARQUEE);//获取焦距setFocusable(true);//走马灯的重复次数,-1代表无限重复setMarqueeRepeatLimit(-1);//强制获得焦点setFocusableInTouchMode(true);}/*** 使这个 View 永远获得焦距* @return true*/@Overridepublic boolean isFocused() {return true;}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".activity.MarqueeActivity"><com.example.rs.recyclerviewdemo.view.MarqueeTextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_green_light"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:padding="@dimen/dp_10"android:singleLine="true"android:text="Always believe that something wonderful is about to happen adsa" /><com.example.rs.recyclerviewdemo.view.MarqueeTextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="@dimen/dp_10"android:background="@android:color/holo_green_light"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:padding="@dimen/dp_10"android:singleLine="true"android:text="Always believe that something wonderful is about to happen adsa" />
</LinearLayout>

效果图:

2.3 问题二

此时如果在布局上加一个 EditText 控件,会是什么效果呢?

问题:加了 EditText 控件后,当 EditText 获得焦距后,第一个跑马灯停止了
原因:因为 EditText 抢占了焦距
解决方法:在自定义 TextView 中,重写父类的 onFocusChanged 方法

/*** 用于 EditText 存在时抢占焦点*/@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {if(focused){super.onFocusChanged(focused, direction, previouslyFocusedRect);}}

隐形问题:
当弹出软键盘时(即 EditText 获得焦距时),跑马灯会重头开始播放;当关闭软键盘时(即 EditText 失去焦距时),跑马灯也会重头开始播放
尚未解决,哪位大神指点下???

2.3 问题三

如果桌面上弹出一个对话框,会是什么效果?

问题:当弹出对话框时,跑马灯效果停止了
原因:Dialog 抢占了焦距
解决方法:在自定义 TextView 中,重写父类的 onWindowFocusChanged 方法

/*** Window与Window间焦点发生改变时的回调* 解决 Dialog 抢占焦点问题* @param hasWindowFocus*/@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {if(hasWindowFocus){super.onWindowFocusChanged(hasWindowFocus);}}

3 自定义跑马灯

自定义跑马灯完整代码

import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;/*** Created by sgll on 2018/11/20.* 自定义:跑马灯* 解决:* 1、EditText 存在时抢占焦距,使跑马灯停止的问题:重写父类的 onFocusChanged 方法* 2、弹出对话框后,跑马灯停止的问题:重写父类的 onWindowFocusChanged 方法*/
public class MarqueeTextView extends android.support.v7.widget.AppCompatTextView {public MarqueeTextView(Context context) {this(context, null);}public MarqueeTextView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);// 设置单行setSingleLine();
//        setMaxLines(1);//设置 Ellipsize,setMaxLines(1) 和 setEllipsize 冲突setEllipsize(TextUtils.TruncateAt.MARQUEE);//获取焦距setFocusable(true);//走马灯的重复次数,-1代表无限重复setMarqueeRepeatLimit(-1);//强制获得焦点setFocusableInTouchMode(true);}/*** 使这个 View 永远获得焦距* @return true*/@Overridepublic boolean isFocused() {return true;}/*** 用于 EditText 存在时抢占焦点*/@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {if(focused){super.onFocusChanged(focused, direction, previouslyFocusedRect);}}/*** Window与Window间焦点发生改变时的回调* 解决 Dialog 抢占焦点问题* @param hasWindowFocus*/@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {if(hasWindowFocus){super.onWindowFocusChanged(hasWindowFocus);}}
}

整体效果

Android -- 自定义跑马灯相关推荐

  1. Android 自定义跑马灯文字

    Android 跑马灯效果文字: 效果图(真实动画很流畅,这个转gif有问题,感觉有点卡): . 代码: /*** Created by wuguangliang on 2018/12/21** 跑马 ...

  2. android 字体跑马灯,Android文字跑马灯功能的实现(自定义跑马灯控件)

    文字跑马灯效果这个功能挺常见的,网上也有很多的介绍,大多是说使用普通的TextView加上几条属性即可实现.不过我在使用时发现并不能实现滚动,可能是因为我的页面中使用到的布局及控件比较复杂,被别的控件 ...

  3. 通过 MarqueeFactory 来提供各种样式的跑马灯 View, 支持自定义跑马灯 ItemView

    MarqueeViewLibrary 项目地址:gongwen/MarqueeViewLibrary 简介:跑马灯 更多:作者   提 Bug    标签: 跑马灯- 通过 MarqueeFactor ...

  4. android 图片跑马灯动画,【Android自定义View】- 文本跑马灯效果

    简介 有些时候,文字过长,或者有多条需要展示的文本时,我们需要将文本进行左右滚动,多条文本时,还得上下滚动以实现展示不同的文本内容.这时候就需要我们自定义view来实现文本跑马灯效果了. 效果图 jj ...

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

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

  6. Android文字跑马灯简单实现的三种方法

    第一种 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  7. Android实现跑马灯效果及问题解决

    今天公司项目让实现一个跑马灯的效果,因为有用户反映总是忘记还款截至时间,于是就要求做一个单条文字横向滚动的效果,用于提示用户. GitHub上找了几个跑马灯的库,本以为可以实现自己想要的效果,不过这个 ...

  8. android自动跑马灯,Android-最强跑马灯

    Android--最强跑马灯 Android 跑马灯已经有很多版本,从最基本的TextView,到重写TextView使TextView取消焦点限制,还有重写TextView利用ScrollTo方法写 ...

  9. Android 多种跑马灯的方法

    转自http://jsf.iteye.com/blog/680257 http://www.devdiv.com/home.php?mod=space&uid=31865&do=blo ...

  10. android paint跑马灯,Android使用Canvas实现跑马灯

    网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计.这样做有很多的缺点: 1.如果TextView没有获取焦点,那么跑马灯的效果无法实现. 2.如果文本长度小于TextView的宽度, ...

最新文章

  1. Druid 配置 wallfilter
  2. 再谈javascript图片预加载经典技术
  3. Nginx压缩输出配置
  4. mysql/event.myd no fond_mysql Last_Error: Error 'File './sales.MYD' not found (Errcode: 24)
  5. 关于mybatis的@Param注解和参数
  6. python并发编程3-进程
  7. java之插入排序算法
  8. Python实现生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
  9. mysql分组查询获取分组中某个字段值最小的一条数据
  10. UIApplication, UIApplicationDelegate,UIApplicationMain的分析
  11. 3台机器配置hadoop集群_复制Hadoop集群之后无法访问端口50070的问题
  12. 免费mysql_MySql 所有的版本都是免费的吗?
  13. 全国大学生数学建模2016年A题系泊系统的设计论文与代码
  14. 见面会 | 创新工场执行董事王嘉平:高性能可伸缩性区块链系统揭秘!
  15. 新一届信息奥赛国家队出炉:3/4来自浙江,北大英才班成最大赢家
  16. 服务器上模拟手机系统软件,云服务器可以用手机模拟器
  17. CSS的浮动属性,详细学习指南
  18. 记录用matlab APP中matlab coder的简单步骤
  19. JZOJ 5602. 【NOI2018模拟3.26】Cti
  20. 【VeighNa】开始量化交易——第三章:构建价差套利

热门文章

  1. python 3d游戏脚本_3ds Max python脚本编写及部分API介绍
  2. 记录一下qt发布程序(.exe)心得,报错0xc00007b错误
  3. html遮罩水印,CSS滤镜遮罩,图片水印效果
  4. QT绘图底层是如何适配各种操作系统的
  5. c语言学习资料 集锦
  6. 小程序源代码_如何找回微信小程序源代码
  7. mac使用fish的时候添加可执行文件路径
  8. 廖雪峰JavaScript教程
  9. html vba 单元格 格式,VBA设置单元格格式之——边框
  10. 如何将内网ip映射到外网