Android自定义可控制速度的跑马灯
作者:Android师哥 发布时间:2023-08-11 14:05:00
标签:Android,跑马灯
背景
原生的TextView是支持跑马灯效果的,但是在项目中实际用了之后,达不到需求,原因是内容滚动太慢,速度无法调节。因此,需要自定义一个可以调节速度的跑马灯。
思路
目前实现的思路是对文本内容不断地重绘,同时改变每次重绘的坐标,来在视觉上达到内容在滚动的效果。缺点是如果每次改变的坐标差值太大,会有明显的卡顿效果。经过调试,下面源码中的速度感觉还可以接受,如果有特殊需求,自行在调试一下。
源码(Kotlin)
class CustomMarqueeView : AppCompatTextView {
companion object {
val SPEED_FAST = 9
val SPEED_MEDIUM = 6
val SPEED_SLOW = 3
}
//View宽度
private var mViewWidth = 0
private var mViewHeight = 0
private var mScrollX = 0F
private var mMarqueeMode = 3
private val rect = Rect()
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
includeFontPadding = false
initAttrs(context, attrs)
}
fun setScrollSpeed(speed: Int) {
if (speed == SPEED_FAST || speed == SPEED_MEDIUM || speed == SPEED_SLOW) {
mMarqueeMode = speed
}
}
override fun onDraw(canvas: Canvas?) {
val textContentText = text.toString().trim()
if (TextUtils.isEmpty(textContentText)) {
return
}
val x = mViewWidth - mScrollX
val y = mViewHeight / 2F + getTextContentHeight() / 2
canvas?.drawText(textContentText, x, y, paint)
mScrollX += mMarqueeMode
if (mScrollX >= (mViewWidth + getTextContentWdith())) {
mScrollX = 0F
}
invalidate()
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
mViewWidth = MeasureSpec.getSize(widthMeasureSpec)
mViewHeight = MeasureSpec.getSize(heightMeasureSpec)
}
override fun setTextColor(color: Int) {
super.setTextColor(color)
paint.setColor(color)
}
private fun initAttrs(context: Context, attrs: AttributeSet?) {
val typeArray = context.obtainStyledAttributes(attrs, R.styleable.CustomMarqueeView)
mMarqueeMode =
typeArray.getInt(R.styleable.CustomMarqueeView_customScrollSpeed, mMarqueeMode)
typeArray.recycle()
}
/**
* 测量文字宽度
* @return 文字宽度
*/
private fun getTextContentWdith(): Int {
val textContent = text.toString().trim()
if (!TextUtils.isEmpty(textContent)) {
paint.getTextBounds(textContent, 0, textContent.length, rect)
return rect.width()
}
return 0
}
/**
* 测量文字高度
* @return 文字高度
*/
private fun getTextContentHeight(): Int {
val textContent = text.toString().trim()
if (!TextUtils.isEmpty(textContent)) {
paint.getTextBounds(textContent, 0, textContent.length, rect)
return rect.height()
}
return 0
}
}
自定义属性
<declare-styleable name="CustomMarqueeView">
<attr name="customScrollSpeed">
<enum name="fast" value="9" />
<enum name="medium" value="6" />
<enum name="slow" value="3" />
</attr>
</declare-styleable>
来源:https://blog.csdn.net/Common_it/article/details/104280994


猜你喜欢
- 前言本文主要介绍其具体的实现思路(视频仅有代码输入,并无过程介绍等),同时,在原本实现的基础上,进行了多处修改和优化,具体参见下面的内容。优
- Unity Shader学习:裁切效果,供大家参考,具体内容如下之前看到有人问关于物体裁切方面的问题,初学shader的话可能搞得不是很明白
- HttpClient介绍HttpClient 不是一个浏览器。它是一个客户端的 HTTP 通信实现库。HttpClient的目标是发 送和接
- 由于Android课程项目需要,特地查阅了okHttp的使用,发现网上找的大多和自己的需求不一样。所以就着团队项目需要,自己简单封装了一个o
- 上文对数据结构与算法,有了一个简单的概述与介绍,这篇文章,我们介绍一中典型数据结构——线性结构。什么是线性结构,线性结构是最简单、最基本、最
- Spring Security和Shiro的区别相同点1、认证功能2、授权功能3、加密功能4、会话管理5、缓存支持6、rememberMe功
- 本文实例讲述了Java中的 * 、过滤器、 * 用法。分享给大家供大家参考,具体如下:一、 * :是在面向切面编程的就是在你的servic
- 在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果。因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口
- 楼主大菜鸟一只,第一次写技术博客,如果有概念错误或代码不规范的地方,还请各位多多批评指正。话不多说,来看题:前一阵子开发了一个用户控件,里面
- mybatis的foreach标签经常用于遍历集合,构建in条件语句或者批量操作语句。下面是foreach标签的各个属性属性描述collec
- 前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧。之前分享过一
- 目录一、所使用的环境配置:二、项目简介三、知识点总结(代码和配置)SpringBoot:1.Mybatis-Plus配置文件,实现分页查询:
- 本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下实现思路:把预览的SurfaceView的宽高设置为
- 1. 介绍这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项
- Android程序编码过程中,回调无处不在。从最常见的Activity生命周期回调开始,到BroadcastReceiver、Service
- 分组类控件主要包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件。一、Panel控件Pan
- 背景介绍你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官!面试官: 小伙子,
- 对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸 * setOnTouchListener即
- 近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的。但是每个code确实对应一个方
- 1.后台参数校验Spring Validation验证框架对参数的验证机制提供了@Validated(Spring JSR-303规范,是标