实现跑马灯的三种方式:分别是直接用控件、自定义一个HorizontalScrollView和自定义一个TextView。

一、直接使用控件:

优点:使用简单

缺点:可扩展性差

使用:直接在XML文件中添加如下代码即可:

<TextViewandroid:id="@+id/tv_desc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:singleLine="true"android:text="春花秋月何时了,往事知多少。问君能有几多愁,恰似一江春水向东流。"android:textColor="#0000ff"android:textSize="80sp" />

二、自定义一个HorizontalScrollView

利用水平滑动的ScrollView来实现。

使用:首先自定义一个HorizontalScrollView控件,然后在XML文件中使用即可(注意在XML中使用自定义控件需要控件的全包名)。

1.自定义的控件代码如下:

public class HorizontalScorllTextView extends HorizontalScrollView implements Runnable{int currentScrollX = 0;// 当前滚动的位置TextView tv;public HorizontalScorllTextView(Context context) {super(context);initView(context);}public HorizontalScorllTextView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public HorizontalScorllTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView(context);}void initView(Context context){View v = LayoutInflater.from(context).inflate(R.layout.scroll_layout, null);tv = (TextView)v.findViewById(R.id.tv_video_name);this.addView(v);}public void setText(String text){tv.setText(text);startScroll();}private void startScroll(){this.removeCallbacks(this);post(this);}@Overridepublic void run() {currentScrollX ++;// 滚动速度scrollTo(currentScrollX, 0);if (currentScrollX >= tv.getWidth()) {scrollTo(0, 0);currentScrollX = 0;}postDelayed(this, 50);}}

2.在XML中使用时如下:

<com.example.marqueedemo.utils.MarqueeTextViewandroid:id="@+id/marqueeTextView"android:layout_width="match_parent"android:layout_height="wrap_content"android:ellipsize="marquee"android:singleLine="true"android:text=""android:textColor="#0f0"android:textSize="80dp" />

三.使用自定义的TextView来实现:

使用:首先自定义一个TextView控件,然后在XML文件中使用即可(注意在XML中使用自定义控件需要控件的全包名)。

1.自定义的控件代码如下:

public class MarqueeTextViewNew extends TextView implements Runnable {private int screenWidth = 80;private int currentScrollX = -screenWidth;// 当前滚动的位置private boolean isStop = false;private int textWidth;private boolean isMeasure = false;public MarqueeTextViewNew(Context context) {super(context);// TODO Auto-generated constructor stub}public MarqueeTextViewNew(Context context, AttributeSet attrs) {super(context, attrs);}public MarqueeTextViewNew(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);if (!isMeasure) {// 文字宽度只需获取一次就可以了getTextWidth();isMeasure = true;}}/*** 获取文字宽度*/private void getTextWidth() {Paint paint = this.getPaint();String str = this.getText().toString();textWidth = (int) paint.measureText(str);}@Overridepublic void run() {
//            currentScrollX -= 1;// 滚动速度,方向:从左向右currentScrollX += 1;// 滚动速度 方向:从右向左scrollTo(currentScrollX, 0);if (isStop) {return;}if (currentScrollX > textWidth) {currentScrollX = -screenWidth;}
//            if (getScrollX() <= -(this.getWidth())) {
//                    scrollTo(textWidth, 0);
//                    currentScrollX = textWidth;
//            }postDelayed(this, 5);}// 开始滚动public void startScroll() {isStop = false;this.removeCallbacks(this);post(this);}// 停止滚动public void stopScroll() {isStop = true;}// 从头开始滚动public void startFor0() {currentScrollX = 0;startScroll();}@Overridepublic void setText(CharSequence text, BufferType type) {// TODO Auto-generated method stubsuper.setText(text, type);startScroll();}@Overridepublic void destroyDrawingCache() {// TODO Auto-generated method stubsuper.destroyDrawingCache();}
}

2.在XML中的使用如下:

 <com.example.marqueedemo.utils.MarqueeTextViewNewandroid:id="@+id/marqueeTextViewNew"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="80sp"android:singleLine="true"android:ellipsize="marquee"android:textColor="@android:color/holo_red_light"android:text="春花秋月何时了,往事知多少。问君能有几多愁,恰似一江春水向东流。"android:layout_centerHorizontal="true"/>

粗略整理,不足之处还望大家指正~~~

跑马灯实现的三种方式相关推荐

  1. 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入

    本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...

  2. QT写word的三种方式

    最近项目里用到了QT写word,入了不少坑,也有了一些很基础的认识,简单说说,希望能帮到大家. 三种方式如下: 1.通过html (优点生成速度快,有点html.css基础就能上车:缺点是只支持css ...

  3. linux设置开机自启服务,linux设置服务开机自启动的三种方式

    linux设置服务开机自启动的三种方式 这里介绍一下linux开机自动启动的几种方法,共计3种,大家可以借鉴一下!经验里面以centos 5.3系统为例! 方法1:.利用ntsysv命令进行设置,利用 ...

  4. 盛大游戏技术总监徐峥:Unity引擎使用的三种方式

    在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...

  5. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  6. k8s-(七)暴露服务的三种方式

    上一篇博客总结的项目怎么部署到k8s上运行,但是运行pod ip是docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,外部网络并没有办法访问,并且,pod ip是随时会变的,不是固定的, ...

  7. 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解

    Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...

  8. 【Spring杂烩】探讨Spring向容器注册Bean的三种方式

    探讨Spring向容器注册Bean的三种方式 重点了解@Import实现的三种子方式 前提概要 Spring向容器注册Bean的三种方式 通过@ComponentScan.@Componet 通过@B ...

  9. 英伟达Jeston nano<3>使用Python实现三种方式串口通信

    英伟达Jeston nano<3>使用Python实现三种方式串口通信 前言 通信配置过程 基本信息 配置过程 方案一:Python-40pinEXpansion Header 方案二:P ...

  10. JavaEE多线程基本概念 及 创建多线程程序的三种方式

    Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...

最新文章

  1. Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
  2. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?...
  3. “面试不败计划”:面试题基础一
  4. 掘金专访 - 收藏集 - 掘金
  5. -bash: xxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
  6. 如何理性看待 5G 速率提升?
  7. Smith Numbers POJ - 1142 (暴力+分治)
  8. CAN分析仪创芯科技使用(Ubuntu)
  9. 927. 三等分(每日一难phase2--day26)
  10. 内网穿透软件NPS--客户端NPC SDK交叉编译ARM64位库
  11. Lorenz混沌系统建模与电路仿真实现
  12. mybatis-基本架构
  13. 基于微信的旅游小程序、景区景点购票小程序、毕业设计、开题报告、毕业论文参考(1)小程序
  14. 【江苏省大学生核心就业能力培训(笔记)】
  15. 国外甲醇汽油的应用概况
  16. SAP SMW0 上传EXCEL模板
  17. 微信电脑端双击不能放大图片怎么回事_IOS 微信 聊天双击放大图片操作
  18. 计算机中文件夹怎么上密码,怎样设置电脑文件夹密码
  19. 旷视研究院获 IROS 2021 The HILTI SLAM 挑战赛冠军
  20. Java8 vs Java11

热门文章

  1. python header函数_Header函数
  2. 电子计算机off键是什么意思,off键是什么意思
  3. Ngxin虚拟主机的三种配置方法
  4. C语言解决渔夫打鱼晒网问题
  5. Emily姨妈家的猫
  6. Xubuntu22.04安装dock美化任务栏
  7. 用正负介子对撞产生的暗能量打开亚空间的机器
  8. 最小生成树(Kruskal、Prim)
  9. Java虚拟机JVM
  10. Kent Beck确认参加敏捷中国大会2009,讲述其35年架构设计心得