跑马灯实现的三种方式
实现跑马灯的三种方式:分别是直接用控件、自定义一个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"/>
粗略整理,不足之处还望大家指正~~~
跑马灯实现的三种方式相关推荐
- 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...
- QT写word的三种方式
最近项目里用到了QT写word,入了不少坑,也有了一些很基础的认识,简单说说,希望能帮到大家. 三种方式如下: 1.通过html (优点生成速度快,有点html.css基础就能上车:缺点是只支持css ...
- linux设置开机自启服务,linux设置服务开机自启动的三种方式
linux设置服务开机自启动的三种方式 这里介绍一下linux开机自动启动的几种方法,共计3种,大家可以借鉴一下!经验里面以centos 5.3系统为例! 方法1:.利用ntsysv命令进行设置,利用 ...
- 盛大游戏技术总监徐峥:Unity引擎使用的三种方式
在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- k8s-(七)暴露服务的三种方式
上一篇博客总结的项目怎么部署到k8s上运行,但是运行pod ip是docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,外部网络并没有办法访问,并且,pod ip是随时会变的,不是固定的, ...
- 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解
Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...
- 【Spring杂烩】探讨Spring向容器注册Bean的三种方式
探讨Spring向容器注册Bean的三种方式 重点了解@Import实现的三种子方式 前提概要 Spring向容器注册Bean的三种方式 通过@ComponentScan.@Componet 通过@B ...
- 英伟达Jeston nano<3>使用Python实现三种方式串口通信
英伟达Jeston nano<3>使用Python实现三种方式串口通信 前言 通信配置过程 基本信息 配置过程 方案一:Python-40pinEXpansion Header 方案二:P ...
- JavaEE多线程基本概念 及 创建多线程程序的三种方式
Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...
最新文章
- Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
- 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?...
- “面试不败计划”:面试题基础一
- 掘金专访 - 收藏集 - 掘金
- -bash: xxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
- 如何理性看待 5G 速率提升?
- Smith Numbers POJ - 1142 (暴力+分治)
- CAN分析仪创芯科技使用(Ubuntu)
- 927. 三等分(每日一难phase2--day26)
- 内网穿透软件NPS--客户端NPC SDK交叉编译ARM64位库
- Lorenz混沌系统建模与电路仿真实现
- mybatis-基本架构
- 基于微信的旅游小程序、景区景点购票小程序、毕业设计、开题报告、毕业论文参考(1)小程序
- 【江苏省大学生核心就业能力培训(笔记)】
- 国外甲醇汽油的应用概况
- SAP SMW0 上传EXCEL模板
- 微信电脑端双击不能放大图片怎么回事_IOS 微信 聊天双击放大图片操作
- 计算机中文件夹怎么上密码,怎样设置电脑文件夹密码
- 旷视研究院获 IROS 2021 The HILTI SLAM 挑战赛冠军
- Java8 vs Java11