当前位置: 首页 > news >正文

Android 视频音量图标

在这里插入图片描述
attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><!--图标颜色--><attr name="ijkSolid" format="color|reference" /><!--喇叭底座宽度--><attr name="ijkCornerWidth" format="dimension|reference" /><!--喇叭底座高度--><attr name="ijkCornerHeight" format="dimension|reference" /><!--音量线条宽度--><attr name="ijkStrokeWidth" format="dimension|reference" /><!--音量线条角度--><attr name="ijkAngle" format="integer|reference" /><!--音量线条数量--><attr name="ijkCount" format="integer|reference" /><!--喇叭底座X--><attr name="ijkLeftCenterX" format="integer|reference" /><!--视频音量--><declare-styleable name="VideoVoice"><!--图标颜色--><attr name="ijkSolid" /><!--喇叭底座宽度--><attr name="ijkCornerWidth" /><!--喇叭底座高度--><attr name="ijkCornerHeight" /><!--音量线条宽度--><attr name="ijkStrokeWidth" /><!--音量线条角度--><attr name="ijkAngle" /><!--音量线条数量--><attr name="ijkCount" /><!--喇叭底座X--><attr name="ijkLeftCenterX" /></declare-styleable>
</resources>

源码

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;import androidx.annotation.Nullable;
import androidx.ijk.R;/*** 视频声音图标*/
public class VideoVoice extends View {/*** 视图宽度、高度*/private int width, height;/*** 画笔*/private Paint paint;/*** 喇叭颜色*/private int solid = Color.CYAN;/*** 喇叭底座宽度*/private int cornerWidth = 0;/*** 喇叭底座高度*/private int cornerHeight = 0;/*** 线条宽度*/private float strokeWidth = 15;/*** 音量百分比*/private float percent = 1.0f;/*** 音量线条角度*/private int angle = 45;/*** 音量线条个数*/private int count = 4;/*** 左边中心X*/private int leftCenterX = 0;public VideoVoice(Context context) {this(context, null, 0);}public VideoVoice(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public VideoVoice(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {this(context, attrs, defStyleAttr, 0);}public VideoVoice(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);paint = new Paint();paint.setAntiAlias(true);paint.setStrokeCap(Paint.Cap.ROUND);if (attrs != null) {TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.VideoVoice);solid = array.getColor(R.styleable.VideoVoice_ijkSolid, solid);cornerWidth = array.getDimensionPixelSize(R.styleable.VideoVoice_ijkCornerWidth, cornerWidth);cornerHeight = array.getDimensionPixelSize(R.styleable.VideoVoice_ijkCornerHeight, cornerHeight);strokeWidth = array.getDimension(R.styleable.VideoVoice_ijkStrokeWidth, strokeWidth);angle = array.getInt(R.styleable.VideoVoice_ijkAngle, angle);count = array.getInt(R.styleable.VideoVoice_ijkCount, count);leftCenterX = array.getDimensionPixelOffset(R.styleable.VideoVoice_ijkLeftCenterX, leftCenterX);array.recycle();}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = getMeasuredWidth();height = getMeasuredHeight();leftCenterX = leftCenterX == 0 ? width / 2 : leftCenterX;cornerWidth = cornerWidth == 0 ? leftCenterX / 2 : cornerWidth;cornerHeight = cornerHeight == 0 ? height / 5 : cornerHeight;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawLeft(canvas);drawRight(canvas);}/*** 绘制左边** @param canvas*/private void drawLeft(Canvas canvas) {paint.setStyle(Paint.Style.FILL);paint.setColor(solid);Path path = new Path();path.moveTo(leftCenterX, 0);path.lineTo(leftCenterX, height);path.lineTo(leftCenterX - cornerWidth, height - cornerHeight);path.lineTo(0, height - cornerHeight);path.lineTo(0, cornerHeight);path.lineTo(leftCenterX - cornerWidth, cornerHeight);path.close();canvas.drawPath(path, paint);}/*** 绘制右边** @param canvas*/private void drawRight(Canvas canvas) {paint.setStrokeWidth(strokeWidth);paint.setStyle(Paint.Style.STROKE);int centerX = leftCenterX;int centerY = height / 2;int rightAngle = angle / count;float rectRadius = (width - leftCenterX - strokeWidth);for (int i = 0; i < count; i++) {paint.setColor(getArcColor(i));int radius = (int) (rectRadius * (i + 1) / count);RectF rectF = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);canvas.drawArc(rectF, 0 - rightAngle * (i + 1), rightAngle * (i + 1) * 2f, false, paint);}}private int getArcColor(int index) {float value = (index + 1.0f) / count;return percent >= value ? solid : Color.WHITE;}/*** 设置颜色** @param solid*/public void setSolid(int solid) {this.solid = solid;invalidate();}/*** 设置音量百分比** @param percent*/public void setValue(float percent) {this.percent = percent;invalidate();}/*** 设置喇叭底座宽度** @param cornerWidth*/public void setCornerWidth(int cornerWidth) {this.cornerWidth = cornerWidth;invalidate();}/*** 喇叭底座高度** @param cornerHeight*/public void setCornerHeight(int cornerHeight) {this.cornerHeight = cornerHeight;invalidate();}/*** 设置线条宽度** @param strokeWidth*/public void setStrokeWidth(float strokeWidth) {this.strokeWidth = strokeWidth;invalidate();}/*** 设置音量线条角度** @param angle*/public void setAngle(int angle) {this.angle = angle;invalidate();}/*** 设置音量线条个数** @param count*/public void setCount(int count) {this.count = count;invalidate();}}

相关文章:

Android 视频音量图标

attrs.xml <?xml version"1.0" encoding"utf-8"?> <resources><!--图标颜色--><attr name"ijkSolid" format"color|reference" /><!--喇叭底座宽度--><attr name"ijkCornerWidth" form…...

VScode 修改 Markdown Preview Enhanced 字体以及大纲编号

修改字体和背景颜色 按快捷键 Ctrl , 打开设置&#xff0c;搜索 markdown-preview-enhanced.previewTheme&#xff0c;选择一个黑色主题的css&#xff0c;如 github-dark.css. 修改自动编号和背景颜色 背景颜色 按 F1 或者 Ctrl Shift P&#xff0c;输入 Customize CSS…...

TCP的FIN报文可否携带数据

问题发现&#xff1a; 发现FTP-DATA数据传输完&#xff0c;TCP的挥手似乎只有两次 实际发现FTP-DATA报文中&#xff0c;TCP层flags中携带了FIN标志 piggyback FIN 问题转化为 TCP packet中如果有FIN flag&#xff0c;该报文还能携带data数据么&#xff1f; 答案是肯定的 RFC7…...

【GoF23种设计模式+简单工厂模式】

一、设计模式概述与类型 1.1、设计模式的一般定义&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码&#xff0c;让代码更容易被他人理解并且保证代…...

北醒单点激光雷达更改id和波特率以及Ubuntu20.04下CAN驱动

序言&#xff1a; 需要的硬件以及软件 1、USB-CAN分析仪使用顶配pro版本&#xff0c;带有支持ubuntu下的驱动包的&#xff0c;可以读取数据。 2、电源自备24V电源 3、单点激光雷达接线使用can线可以组网。 一、更改北醒单点激光雷达的id号和波特率 安装并运行USB-CAN分析仪自带…...

【线性代数】矩阵变换

一些特殊的矩阵 一&#xff0c;对角矩阵 1&#xff0c;什么是对角矩阵 表示将矩阵进行伸缩&#xff08;反射&#xff09;变换&#xff0c;仅沿坐标轴方向伸缩&#xff08;反射&#xff09;变换。 2&#xff0c;对角矩阵可分解为多个F1矩阵&#xff0c;如下&#xff1a; 二&a…...

聚焦智慧出行,TDengine 与路特斯科技再度携手

在全球汽车行业向电动化和智能化转型的过程中&#xff0c;智能驾驶技术正迅速成为行业的焦点。随着消费者对出行效率、安全性和便利性的需求不断提升&#xff0c;汽车制造商们需要在全球范围内实现低延迟、高质量的数据传输和处理&#xff0c;以提升用户体验。在此背景下&#…...

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错&#xff1a;虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机&#xff0c;查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…...

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…...

如何乘上第四次工业革命的大船

如何乘上第四次工业革命的大船 第四次工业革命通常被认为是信息技术和数字化时代的到来,但具体影响哪些产业,以及它将如何演变和展开,仍然是一个广泛讨论的话题。 然而,已经可以看到一些领域可能受到第四次工业革命的深远影响,例如人工智能、物联网、大数据、生物技术、可…...

RKNN执行bash ./build-linux_RK3566_RK3568.sh 报错

目录 报错信息: 原因分析: 解决办法: 报错信息: CMake Error at /usr/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake:49 (message): Could not find compiler set in environment variable CC: aarch64-linux-gnu-gcc. Call Stack (most recent call fir…...

Linux常用命令整理

本文将分享一些常用的Linux命令。根据功能的不同&#xff0c;大概分为以下几个方面&#xff0c;一是文件相关命令&#xff0c;二是进程相关命令&#xff0c;三是网络相关命令&#xff0c;四是磁盘相关命令&#xff0c;五是用户管理相关命令&#xff0c;六是系统命令。 1. 文件…...

python 闭包、装饰器

一、闭包&#xff1a; 1. 外部函数嵌套内部函数 2. 外部函数返回内部函数 3.内部函数可以访问外部函数局部变量 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且内部函数可以访问外部函数的局部变量&#xff0c;即使外部函数已经执行…...

[pycharm]解决pycharm运行程序出现卡住scanning files to index索引的问题

有时候会出现索引问题&#xff0c;显示scanning files to index 解决方法&#xff1a; in pycharm, go to the "File" on the left top, then select "invalidate caches/restart...", and press "invalidate and restart". 然后等它自己重启…...

python每日学习11:numpy库的用法(下)

python每日学习11&#xff1a;numpy库的用法(下) 数组的拼接 名方法称说明concatenate连接沿现有轴的数组序列hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09;concatenate函数用于沿指定轴连接相同形状的两…...

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

6、基于Fabirc 2.X 通用电子存证系统部署

evidence 将GOPATH设置为/root/go,拉取项目&#xff1a; cd $GOPATH/src && git clone https://gitee.com/henan-minghua_0/evidence.git 在/etc/hosts中添加&#xff1a; 127.0.0.1 orderer.example.com 127.0.0.1 peer0.org1.example.com 127.0.0.1 peer1.org…...

Linux Vim 由浅入深的教程

引言 原文链接 Vim是Linux系统中非常强大的文本编辑器&#xff0c;因其强大的功能和灵活的操作而受到广泛使用。尤其是在服务器管理和开发环境中&#xff0c;Vim几乎是必备工具。本教程将以CentOS 7为例&#xff0c;详细讲解Vim的安装、基本操作以及一些高级技巧&#xff0c;…...

MIT6.824(6.5840) Lab1笔记+源码

文章目录 其他人的内容&#xff0c;笔记写的更好&#xff0c;思路可以去看他们的MapReduceworkermapreduce coordinatorrpc纠错 源码worker.gocoordinator.gorpc.go 原本有可借鉴的部分 mrsequential.go&#xff0c;多看几遍源码 其他人的内容&#xff0c;笔记写的更好&#xf…...

【目录】8051汇编与C语言系列教程

8051汇编与C语言系列教程 作者将狼才鲸创建日期2024-07-23 CSDN文章地址&#xff1a;【目录】8051汇编与C语言系列教程本Gitee仓库原始地址&#xff1a;才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 一、本教程目录 序号教程名称简述教程链接1点亮LCD灯通过IO…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...