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

这个跑马灯效果比自定义VIew实现丝滑,丝滑效果主要还是对颜色的取值比较关键

public class FluidColorfulFrameDrawable extends Drawable {private Paint paint;private RectF bounds;private RectF rectF = new RectF();private float defaultRadius = SizeUtils.dp2px(10);private float defaultStrokeWidth = SizeUtils.dp2px(10);private int colorPurple = Color.parseColor("#855bff");private int colorBlue = Color.parseColor("#3cfff8");private int colorGreen = Color.parseColor("#855bff");private int colorYellow = Color.parseColor("#ffd220");private int[] colors = {colorPurple,colorBlue, colorGreen,colorYellow,colorPurple,colorBlue, colorGreen,colorYellow,colorPurple,colorBlue, colorGreen};private int strokeWidth;private Matrix mtx = new Matrix();private float degree = 0f;public FluidColorfulFrameDrawable(int strokeWidth) {this.strokeWidth = strokeWidth;init();}// Getter和Setter方法public float getDegree() {return degree;}public void setDegree(float value) {degree = value;invalidateSelf();}private void init(){paint = new Paint();paint.setStyle(Paint.Style.STROKE);if(strokeWidth<0){paint.setStrokeWidth(defaultStrokeWidth);}else {paint.setStrokeWidth(strokeWidth);}}@Overridepublic void draw(@NonNull Canvas canvas) {mtx.reset();mtx.setRotate(degree, bounds.centerX(), bounds.centerY());((SweepGradient)paint.getShader()).setLocalMatrix(mtx);
//        canvas.drawRoundRect(rectF, defaultRadius, defaultRadius, paint);canvas.drawRect(rectF,paint);}@Overridepublic void setBounds(int left, int top, int right, int bottom) {super.setBounds(left, top, right, bottom);bounds = new RectF(left, top, right, bottom);rectF.left = 0;//defaultStrokeWidth / 2rectF.top = 0;//defaultStrokeWidth / 2
//        rectF.right = bounds.width() - defaultStrokeWidth / 2;rectF.right = bounds.width();
//        rectF.bottom = bounds.height() - defaultStrokeWidth / 2;rectF.bottom = bounds.height();SweepGradient gradient = new SweepGradient(bounds.centerX(), bounds.centerY(), colors, null);paint.setShader(gradient);}@Overridepublic void setAlpha(int alpha) {paint.setAlpha(alpha);}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {paint.setColorFilter(colorFilter);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}// 创建一个Property对象用于ObjectAnimator与"degree"属性交互private Property<FluidColorfulFrameDrawable, Float> degreeProperty =new Property<FluidColorfulFrameDrawable, Float>(Float.class, "degree") {@Overridepublic Float get(FluidColorfulFrameDrawable object) {// 返回当前degree的值return object.getDegree(); // 假设有一个getDegreeValue()方法来获取当前值}@Overridepublic void set(FluidColorfulFrameDrawable object, Float value) {// 设置degree的值并触发任何必要的更新object.setDegree(value);}};private ObjectAnimator fluidAnim;public void startFluid() {fluidAnim = ObjectAnimator.ofFloat(this, degreeProperty, 0f, 360f);fluidAnim.setDuration(10000L);fluidAnim.setInterpolator(new LinearInterpolator());fluidAnim.setRepeatCount(ValueAnimator.INFINITE);fluidAnim.start();}public void cancelFluid() {fluidAnim.cancel();}}

使用:

private void setBackGroundDrawable(RelativeLayout layout){FluidColorfulFrameDrawable fluidColorfulFrameDrawable = new FluidColorfulFrameDrawable(paddingWidth);fluidColorfulFrameDrawable.setBounds(0,0,ScreenUtils.getScreenWidth(),ScreenUtils.getScreenHeight()-getHeight(context));layout.setBackground(fluidColorfulFrameDrawable);fluidColorfulFrameDrawable.startFluid();
}

把最外层的布局layout传进来就行

paddingWidth是边距也就是灯带的宽度,这个自己定义就行

ScreenUtils.getScreenWidth(),ScreenUtils.getScreenHeight()都是三方工具

implementation 'com.blankj:utilcodex:1.30.6'

getHeight是获取状态栏高度

public static int getHeight(Context context) {int statusBarHeight = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);}if (isFlymeOs4x()) {return 2 * statusBarHeight;}return statusBarHeight;
}

这里可以根据自己需要到底去不去掉这个状态栏高度

其实跟自定义View的原理都相差不多,差不多都是旋转画布

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

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

相关文章

redhat基础的环境搭建

1:利用RUFUS进行U盘启动制作&#xff08;Rufus - 轻松创建 USB 启动盘&#xff09; 2&#xff1a;下载nvidia驱动后安装出现&#xff08;redhat安装驱动会有几个坑&#xff0c;可以参考这个CentOS 7.6安装 NVIDIA 独立显卡驱动&#xff08;完整版&#xff09;_centos 7.6 64位…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

第15章 呈现数据《Linux命令行与Shell脚本编程大全笔记》

bash shell 文件描述符&#xff0c;使用文件描述符>或者>>或者< 文件描述符缩写描述0STDIN标准输入1STDOUT标准输出2STDERR标准错误&无标准输出和标准错误 临时重定向到文件描述符>&2&#xff0c;需要在索引值之前加一个&exec:永久重定向&#xf…

力扣刷题之978.最长湍流子数组

题干要求&#xff1a; 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满足下列条…

FPGA笔试

半加器和全加器的区别&#xff1a; 1、半加器不考虑输入的进位&#xff0c;称之为半加。 2、全加器反之&#xff0c;考虑进位。 SRAM/DRAM优缺点对比_sram和dram的主要区别及优缺点-CSDN博客 消除竞争冒险的方法 ①滤波电容&#xff1a;因为尖峰脉冲很窄&#xff0c;用很小的…

LM(Levenberg-Marquardt) PCG(预条件共轭梯度法)

文章目录 PCG共轭梯度法PCG算法步骤示例程序实现运行结果PCG vs LMPCG优势PCG劣势LM优势LM劣势综合比较对比示例代码结果与对比总结 PCG共轭梯度法 预条件共轭梯度法&#xff08;PCG&#xff09;是一种用于求解大规模稀疏线性系统 A x b Ax b Axb的迭代方法。它在求解对称正…

棱镜七彩上榜《嘶吼2024网络安全产业图谱》两大领域

7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff0c;棱镜七彩凭借在软件供应链安全领域出色的技术能力和优异的市场表现&#xff0c;上榜软件成分分析&#xff08;SCA&#xff09;、源代码安全两项细分领域。 据悉&#xff0c;本次《嘶吼2…

.net Excel的Winform控件 使用JSON公式代码

可以配合点击事件通过调接口的公式查询第三方平台的数据 using Feng.Json; using Feng.Script.CBEexpress; using Feng.Script.Method; using System; using System.Collections.Generic;namespace Feng.Script.FunctionContainer {[Serializable]public class JsonFunctionC…

1、PostgreSQL安装

PostgreSQL安装 1、postgreSQL介绍 PostgreSQL是一个免费的对象关系型数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;在灵活的BSD许可证下发行.PostgreSQL开发者把它念作post-gress-Q-L。PostgreSQL的Slogan是“世界上最先进的开源关系型数据库”。“开源界的Oracl…

成为CMake砖家(2): macOS创建CMake本地文档的app

大家好&#xff0c;我是白鱼。 使用 CMake 的小伙伴&#xff0c; 有的是在 Windows 上&#xff0c; 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式&#xff0c; 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…

防火墙--带宽管理

目录 核心思想 带宽限制 带宽保证 连接数的限制 如何实现 接口带宽 队列调度 配置位置 在接口处配置 带宽策略配置位置 带宽通道 配置地方 接口带宽、带宽策略和带宽通道联系 配置顺序 带块通道在那里配置 选项解释 引用方式 策略独占 策略共享 重标记DSCP优先…

Unity 关于Button无法高亮的问题

在Unity中&#xff0c;当我们新创建一个ButtonUI组件&#xff0c;并保持默认设置时&#xff0c;当我们把鼠标移动到Button上面时&#xff0c;Button是可以正常高亮的。但是当我们点击Button后再移动鼠标到Button处会发现Button无法高亮了。只有点击空白处后再移动鼠标到Button中…

文件乱码问题的一例分析

今天查看日志,遇到一种乱码问题, 终端展示的文件内容为: “\r\r\n” 尝试分析其原文. 使用xxd按照十六进制查看, 得到对应数据为: c3 8e c3 84 c2 bc c3 be c2 b2 c2 bb c2 b4 c3 a6 c3 94 c3 9a 0d 0d 0a 里面c3和c2大量存在,怀疑与两重编码有关, 使用NodeJS iconv-lite 做如…

软件游戏缺失concrt140.dll的解决方法,轻松搞定dll丢失问题

为了解决concrt140.dll文件缺失的问题&#xff0c;首先需要了解concrt140.dll文件的具体情况。只有在充分了解的基础上&#xff0c;才能采取有效的解决措施。下面&#xff0c;将详细介绍concrt140.dll文件及其解决方案。 一、了解concrt140.dll是什么 concrt140.dll 是微软的一…

SmartPipe新增功能:自动识别含间隙的低质量模型与自动处理超过180度的圆弧管路

自2022年12月SmartPipe上市以来&#xff0c;我一直在不断迭代和升级其轴线识别算法。对于客户反馈的无法自动转换的模型&#xff0c;我都视若珍宝&#xff0c;将其视为提升算法性能的绝佳机会。经过一年半的积累&#xff0c;SmartPipe的测试模型从最初的10个逐步迭代到近100个。…

使用MySQL WorkBench导出SQL脚本

参考: 在MySQL workbench 中导出sql脚本文件_mysql workbench自动保存的脚本在哪-CSDN博客 需要注意的是: 选择高级选项 这里不勾选&#xff0c;这样生成的INSERT是逐条的。将每个ROW合并为一个INSERT语句。 这里选择dump structure and data

画册制作攻略,助你成为视觉传达大师

在数字时代&#xff0c;画册作为一种传统而又充满魅力的视觉传达工具&#xff0c;依旧在各个领域扮演着重要角色。无论是在企业宣传、个人作品展示&#xff0c;还是艺术创作中&#xff0c;一本精美的画册都能让你的作品更具吸引力。那么&#xff0c;如何制作出一本引人入胜的画…

SQL Error: 1406, SQLState: 22001

SQL错误代码1406和SQLState 22001通常表示“列数据过长”错误。这意味着尝试插入或更新列中的值&#xff0c;但该值的长度超过了该列允许的最大长度。 解决此问题的几个步骤&#xff1a; 检查列长度&#xff1a; 确定引起错误的列。检查数据库架构中该列允许的最大长度。 验证…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

创作模板三【创作模板】

xxx【创作模板三】 前言推荐说明最后 前言 2023年3月13日 以下内容源自《创作模板三》 仅供学习交流使用 推荐 无 说明 大三下的模板 专栏&#xff1a;计算机网络 【最后】的文案 因为确实不在意别人的看法&#xff0c;你了解的我不足万分之一 最后 你对我百般注视&am…