Android 自定义实现灯带跑马灯效果

public class MyMarqueeView extends View {private Paint paint;private RectF rect;private float startX, startY, endX, endY;private float currentX,currentY;/*** 灯大小*/private int radius = 15;/*** 多少毫秒绘制一个圆点* 最小80*/private int time = 100;/*** 绘制的圆点个数,如果数量等于全部数量重新绘制或者取消*/int drawNumber = 1;private int[] myColors = new int[]{Color.YELLOW,Color.BLUE,Color.RED,Color.GREEN};private String colorPurple = "#8000FF";private String colorOrange = "#FFA500";private String colorPink = "#FFC0CB";private String colorGolden = "#D4AF37";public MyMarqueeView(Context context) {super(context);init();}public MyMarqueeView(Context context, AttributeSet attrs) {super(context, attrs);init();}public MyMarqueeView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}public int getStatusBarHeight() {int result = 0;int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {result = getResources().getDimensionPixelSize(resourceId);}return result;}/*** 一行多少个点点* 一列有多少个点点*/private int hNumber,vNumber;/***  单行某个颜色有多少个*  单列某个颜色有多少个*/private int hChildNumber,vChildNumber;int width,height;private void init() {paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setStyle(Paint.Style.FILL);width = ScreenUtils.getScreenWidth();height = ScreenUtils.getScreenHeight()-getStatusBarHeight()-radius;//获取一行一列有多少个点点hNumber = width/(2*radius)-1;hChildNumber = hNumber/myColors.length;vNumber = height/(2*radius)-1;vChildNumber = vNumber/myColors.length;rect = new RectF(0, 0, width, height);startX = rect.left+ radius;startY = rect.top + radius;endX = rect.right - radius;endY = rect.bottom - 2*radius;currentX = startX;currentY = startY;startTimer();}private void startTimer(){CountDownTimer timer = new CountDownTimer(4*time,time) {@Overridepublic void onTick(long millisUntilFinished) {switch (drawNumber){case 1:color = YELLOW;break;case 2:color = BLUE;break;case 3:color = RED;break;case 4:color = GREEN;break;}drawNumber++;invalidate();}@Overridepublic void onFinish() {drawNumber = 1;this.start();}};timer.start();}/*** 四种颜色*/private String color = "";private static final String YELLOW = "yellow",BLUE = "blue",RED = "red",GREEN = "green";@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setStrokeWidth(20);// 绘制跑马灯效果switch (color){case YELLOW:LinearGradient gradient = new LinearGradient(0,0,width,height,Color.parseColor(colorPurple),Color.parseColor(colorPink), Shader.TileMode.CLAMP);paint.setShader(gradient);drawYellowCircle(canvas,0,0);break;case BLUE:LinearGradient gradient1 = new LinearGradient(0,0,width,height,Color.GREEN,Color.YELLOW, Shader.TileMode.CLAMP);paint.setShader(gradient1);drawYellowCircle(canvas,hChildNumber,vChildNumber);break;case RED:LinearGradient gradient2 = new LinearGradient(0,0,width,height,Color.RED,Color.parseColor(colorOrange), Shader.TileMode.CLAMP);paint.setShader(gradient2);drawYellowCircle(canvas,2*hChildNumber,2*vChildNumber);break;case GREEN:LinearGradient gradient3 = new LinearGradient(0,0,width,height,Color.parseColor(colorPurple),Color.parseColor(colorGolden), Shader.TileMode.CLAMP);paint.setShader(gradient3);drawYellowCircle(canvas,3*hChildNumber,3*vChildNumber);break;}}private void drawYellowCircle(Canvas canvas,int hStartNumebr,int vStartNumebr){//画上边点点currentX = startX + hStartNumebr*2*radius;currentY = startY;canvas.drawLine(currentX,startY,currentX+hChildNumber*2 * radius,startY,paint);//画右边currentY = startY+vStartNumebr*2*radius;canvas.drawLine(endX,currentY,endX,currentY+vChildNumber*2*radius,paint);//画底部点点currentX = endX-hStartNumebr*2*radius;canvas.drawLine(currentX,endY,currentX-hChildNumber*2*radius,endY,paint);//画左边currentY = endY-vStartNumebr*2*radius;canvas.drawLine(startX,currentY,startX,currentY-vChildNumber*2*radius,paint);}}

这里用LinearGradient加的渐变色

也可以直接paint.setColor设置颜色,time的大小控制画的速度也就是灯的速度,建议100毫秒

使用的话直接布局用就就可以

另一种方案是画圆点,就是换换方法的事,drawLine换drawCircle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用bootstrap框架做一个Aotm Blog个人博客

使用bootstrap框架做一个Aotm Blog个人博客,展示一些自己的个人信息,有四个博客分类:心情记录、学习笔记、旅行相册、美食打卡。 主界面图: 心情记录界面 学习笔记界面: 旅行相册界面: 美食打卡界面&#…

深入探索:大型语言模型消除幻觉的解决之道

随着人工智能技术的飞速发展,大型语言模型(LLMs)已经成为自然语言处理领域的明星。它们以其庞大的知识库和生成连贯、上下文相关文本的能力,极大地推动了研究、工业和社会的进步。然而,这些模型在生成文本时可能会产生…

Unity保存玩家的数据到文件中(Unity的二进制序列化)

文章目录 文章运行环境什么是二进制序列化读写文件构造函数 自定义二进制序列化 文章运行环境 Unity2022 什么是二进制序列化 Unity中的二进制序列化是一种将游戏对象或数据结构转换为二进制格式的过程,以便于存储或网络传输。这使数据能够以高效的方式保存&…

liburing和Linux io_uring源码阅读

liburing 版本 系统内核版本: Linux 5.15.0-107-generic #117~20.04.1-Ubuntu x86_64 GNU/Linux 源代码版本: gitgithub.com:torvalds/linux.git v5.15 阅读入口 从最简单的代码看起,即阅读入口:examples/io_uring-test.c 此源文件内部调用liburing相关…

富唯智能推出的AMR复合机器人铝板CNC上下料方案

随着科技的不断进步,CNC加工行业正面临着前所未有的变革。传统的CNC上下料方式已无法满足现代生产对效率、精度和安全性的高要求。在这样的背景下,富唯智能推出的AMR复合机器人铝板CNC上下料方案,以其智能化、自动化的特点,引领了…

Mind+在线图形编程软件(Sractch类软件)

Scratch作为图形编程软件,可以为小朋友学习编程提供很好的入门,是初次接触编程的小朋友的首选开发软件。这里介绍的Mind软件与Sractch用法几乎完全一致,并且可以提供在线免安装版本使用,浏览器直接打开网址: ide.mindp…

LeetCode.32最长有效括号详解

问题描述 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 解题思路1 有效的括号字符串意味着每一个左括号 ( 都可以找到一个相匹配的右括号 )。栈可以帮助我们追踪尚未匹配的括号,并有效地处理…

Micro-ROS是什么?

Micro-ROS是ROS(Robot Operating System,机器人操作系统)生态系统的一个重要组成部分,专为微控制器(Microcontrollers)设计的轻量级ROS版本。它的目标是在资源有限的嵌入式平台上实现ROS 2的功能&#xff0…

RocketMQ:日常开发中有哪些使用MQ的场景

什么是消息队列? 消息队列是一种通信方法,允许应用程序通过发送和接收消息来互相通信。这些消息/任务/指令存储在一个中间介质中(即队列),并由生产者发送,消费者接收。 使用场景 场景一:任务…

对于使用 C 语言开发的跨平台应用,如何解决不同操作系统和硬件架构带来的底层差异和兼容性问题?

在使用C语言开发跨平台应用时,可以采取以下方法来解决不同操作系统和硬件架构带来的底层差异和兼容性问题: 使用平台无关的标准库:使用C语言标准库提供的函数和数据类型,避免直接使用操作系统特定的函数和数据类型。 使用条件编译…

昇思25天学习打卡营第1天|基本介绍

MindSpore 基本介绍设计理念层次结构 基本介绍 昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景统一部署三大目标。 易开发:API友好、调试难度低高效执行:包括计算效率、数据预处理效率和分布式训练效率全场景&am…

手写SpringMVC之ApplicationContextListener

什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 手写…

hive-LEAD() over() 取字段的下一个值

lead(status,1,null) over(partition by shop oreder by month) as next_status --lead()参数1:目标字段;参数2:步长(是取下1个还是下2个);参数3:取不到给NULL SELECTa.related_org_code,a.camera_id,a.event_ti…

【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存

服务器重启后之前添加进去的数据消失了,排查了一圈发现数据没有进行持久化保存导致的 在Elasticsearch 6.0.0中,数据的持久化存储主要通过以下几个配置来实现: 1、path.data: 指定Elasticsearch用于存储数据的目录。 2、path.logs: 指定Elasticsearch日志文件存储的目录。 …

【python】OpenCV—Color Map

文章目录 cv2.applyColorMapcv2.putText小试牛刀自定义颜色 参考学习来自 OpenCV基础(21)使用 OpenCV 中的applyColorMap实现伪着色 cv2.applyColorMap cv2.applyColorMap() 是 OpenCV 中的一个函数,用于将灰度图像或单通道图像应用一个颜色…

The First Descendant卡顿怎么办?快速处理第一后裔卡顿

第一后裔/The First Descendant是一款刷宝类RPG射击游戏,以虚幻引擎5为基础,使其对决场景十分精彩、刺激,从而吸引了大批冒险者前往,这里揭开属于英格里斯和继承者的秘密。不过有很多玩家,反馈在对局时遇到了卡顿、画面…

Ubuntu 20.04.3 LTS 安装打印服务器 局域网发现系统服务 共享给 windows 10/11 使用

ubuntu安装部署打印服务器可参考: Ubuntu 20.04.3 LTS 安装hp 1020 plus 打印机 通过cups共享给 windows 10/11 使用-CSDN博客 1 windows 10 ,局域网搜索不到共享的hp1020打印机 2 Ubuntu使用Avahi进行局域网服务发现和设备发现,安装avahi-daemon sudo apt-updat…

计算机的核心、线程、进程,任务、指令,他们之间的关系及工作原理

一、基本概念 1)指令的含义及组成 定义:指令是计算机程序发给处理器的命令,它是计算机硬件语言系统(机器语言)的一部分,用来指挥CPU执行特定的操作。内容:一条指令通常包括操作码和地址码。操…

【Linux】Linux下使用套接字进行网络编程

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 用于网络应用开…

DNS自动择优:提升网络体验的新途径

随着互联网的深入发展和广泛应用,网络速度和网络稳定性成为了用户关注的重点。在这个过程中,DNS(Domain Name System,域名系统)的作用不容忽视。近年来,DNS自动择优技术的出现,为提升网络体验带…