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.util.AttributeSet;
import android.view.View;import androidx.annotation.Nullable;
import androidx.ijk.R;/*** 视频亮度图标*/
public class VideoBrightness extends View {private Paint paint;/*** 填充颜色*/private int solid = Color.CYAN;private int solidClone = solid;/*** 中心x*/private float cx;/*** 中心y*/private float cy;/*** 半径*/private float radius = 0;/*** 直径*/private float diameter = 0;/*** 线条长度*/private float lineLength = 0;/*** 线条和中心圆间距*/private int gap = 20;/*** 线条宽度*/private float lineWidth = 5;public VideoBrightness(Context context) {this(context, null);}public VideoBrightness(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public VideoBrightness(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);if (attrs != null) {TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.VideoBrightness);solid = solidClone = array.getColor(R.styleable.VideoBrightness_ijkSolid, solid);radius = array.getDimension(R.styleable.VideoBrightness_ijkRadius, radius);lineLength = array.getDimension(R.styleable.VideoBrightness_ijkLineLength, lineLength);gap = array.getDimensionPixelSize(R.styleable.VideoBrightness_ijkGap, gap);lineWidth = array.getDimension(R.styleable.VideoBrightness_ijkLineWidth, lineWidth);array.recycle();}paint = new Paint();paint.setAntiAlias(true);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);cx = getMeasuredWidth() / 2;cy = getMeasuredHeight() / 2;diameter = Math.min(getMeasuredHeight(), getMeasuredWidth());radius = radius == 0 ? diameter / 6 : radius;lineLength = lineLength == 0 ? (diameter / 12 - gap) : lineLength;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setColor(solid);paint.setStyle(Paint.Style.FILL);canvas.drawCircle(cx, cy, radius, paint);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(lineWidth);paint.setStrokeCap(Paint.Cap.ROUND);float length = radius + gap;for (int angle = 0; angle < 360; angle += 45) {double radians = Math.toRadians(angle);float startX = cx + (float) (length * Math.cos(radians));float startY = cy + (float) (length * Math.sin(radians));float endX = cx + (float) ((length + lineLength) * Math.cos(radians));float endY = cy + (float) ((length + lineLength) * Math.sin(radians));canvas.drawLine(startX, startY, endX, endY, paint);}}/*** 设置填充颜色** @param solid*/public void setSolid(int solid) {this.solid = solidClone = solid;invalidate();}/*** 设置填充颜色值百分比** @param percent*/public void setSolidAlpha(float percent) {percent = percent < 0.25f ? 0.25f : percent;int alpha = Color.alpha(solidClone);int red = Color.red(solidClone);int green = Color.green(solidClone);int blue = Color.blue(solidClone);alpha *= percent;solid = alpha << 24 | red << 16 | green << 8 | blue;invalidate();}/*** 设置半径大小** @param radius*/public void setRadius(float radius) {this.radius = radius;invalidate();}/*** 设置线段长度** @param lineLength*/public void setLineLength(float lineLength) {this.lineLength = lineLength;invalidate();}/*** 设置线段和圆圈间距** @param gap*/public void setGap(int gap) {this.gap = gap;invalidate();}/*** 设置线段宽度** @param lineWidth*/public void setLineWidth(float lineWidth) {this.lineWidth = lineWidth;invalidate();}}

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

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

相关文章

WINUI或WPF灵活使用样式、控件模板、自定义控件、用户控件

在WINUI与WPF 中&#xff0c;控件模板&#xff08;ControlTemplate&#xff09;、样式&#xff08;Style&#xff09;、自定义控件&#xff08;CustomControl&#xff09;和用户控件&#xff08;UserControl&#xff09;都是构建复杂和灵活用户界面的重要工具&#xff0c;但它们…

【electron6】浏览器实时播放PCM数据

pcm介绍&#xff1a;PCM&#xff08;Puls Code Modulation&#xff09;全称脉码调制录音&#xff0c;PCM录音就是将声音的模拟信号表示成0,1标识的数字信号&#xff0c;未经任何编码和压缩处理&#xff0c;所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信…

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业&#xff0c;特别是大型央国企而言&#xff0c;日常的安全部署和运营管理往往横跨多家子公司&#xff0c;所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时&#xff0c;难度更是呈“几何级数”上升&#xff1a; 合规难 众…

安卓 mvp 的架构的详细介绍

MVP 架构介绍 MVP&#xff08;Model-View-Presenter&#xff09;是一种软件架构模式&#xff0c;常用于构建用户界面&#xff08;UI&#xff09;。它将应用程序的逻辑划分为三个部分&#xff1a;Model、View 和 Presenter。MVP 的主要目标是分离视图和业务逻辑&#xff0c;使代…

使用github actions构建多平台electron应用

1. 创建electron项目 使用pnpm创建项目 pnpm create quick-start/electron 2. 修改electron-builder.yml文件 修改mac的target mac:target:- target: dmgarch: universal 3. 添加workflow 创建 .github/workflows/main.yml 文件 name: Build/release Electron appon:work…

二、原型模式

文章目录 原型模式1 基本介绍2 实现方式深浅拷贝目标2.1 使用 Object 的 clone() 方法2.1.1 代码2.1.2 特性2.1.3 实现深拷贝 2.2 在 clone() 方法中使用序列化2.2.1 代码 2.2.2 特性 3 实现的要点4 Spring 中的原型模式5 原型模式的类图及角色5.1 类图5.1.1 不限制语言5.1.2 在…

8、添加第三方包

目录 1、安装Django Debug Toolbar Django的一个优势就是有丰富的第三方包生态系统。这些由社区开发的包&#xff0c;可以用来快速扩展应用程序的功能集 1、安装Django Debug Toolbar Django Debug Toolbar位于名列前三的第三方包之一 这是一个用于调试Debug Web应用程序的有…

小程序-5(vant组件+全局数据共享+分包+tabBar案例)

目录 1.使用npm包 小程序对npm的支持和限制 使用vant组件 使用CSS变量定制主题样式 API的promise化 2.全局数据共享 小程序中的全局数据共享方案 安装MobX相关的包 创建MobX的store实例 将Store中的成员绑定到页面中 在页面上使用Store中的成员 将Store中的成员绑定…

Python——使用Seaborn钻石数据可视化分析(2)

续 Python——使用Seaborn钻石数据可视化分析(1) 目录 📈 4、非数值变量描述性统计分析 1️⃣ 柱状图——分析钻石切工的情况 📍 sns.countplot —— 绘制柱状图、条形图 2️⃣ 箱线图——分析不同切工的钻石的价格情况 📍 sns.barplot —— 不同分类变量之间的数…

【论文阅读】Mamba: Linear-Time Sequence Modeling with Selective State Spaces

Mamba: Linear-Time Sequence Modeling with Selective State Spaces 论文&#xff1a;[2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces 作者&#xff1a;Albert Gu 和 Tri Dao&#xff0c;分别来自卡内基梅隆大学机器学习系和普林斯顿大学计…

HarmonyOS ArkUi 唤起系统APP:指定设置界面、浏览器、相机、拨号界面、选择通讯录联系人

效果&#xff1a; 完整工具类&#xff1a; import { common, Want } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit; import { call } from kit.TelephonyKit; import { promptAction } from kit.ArkUI; import { contact } from kit.Contacts…

docker 部署wechatbot-webhook 并获取接口实现微信群图片自动保存到chevereto图库等

功能如图&#xff1a; docker部署 version: "3" services:excalidraw:image: dannicool/docker-wechatbot-webhook:latestcontainer_name: wechatbot-webhookdeploy:resources:limits:cpus: 0.15memory: 500Mreservations:cpus: 0.05memory: 80Mrestart: alwayspor…

RabbitMQ学习实践二:MQ的实现

文章是本人在学习springboot实现消息队列功能时所经历的过程的记录&#xff0c;仅供参考&#xff0c;如有侵权请随时指出。 参考文章地址&#xff1a; RabbitMQ安装与入门_rabbitmq win11配置-CSDN博客 RabbitMQ入门到实战一篇文章就够了-CSDN博客 RabbitMQ系列&#xff08…

走进数组的奇妙之旅

引言&#xff1a; 在前几篇文章中&#xff0c;我们深入探讨了函数的奥秘。在讲述函数知识的过程中&#xff0c;我们邂逅了一个新的概念&#xff0c;你或许还记得在演示 strcpy函数时&#xff0c;出现的这行代码&#xff1a;char1[20]{0};。当时&#xff0c;你是否感到好奇&…

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件&#xff1a;id_rsa 和 id_rsa.pub 1.2 拷…

《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记

《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战&#xff0c;重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …

外企跨境传输应该如何做到安全有效的文件管控?

跨境文件传输并非易事&#xff0c;它面临着多重挑战&#xff0c;尤其是数据安全、隐私保护以及法律法规遵守等问题。所以如何做到安全有效的文件管控&#xff0c;却是一个让许多企业头疼的问题。小编今天将说说跨境文件传输面临的主要挑战&#xff0c;并讨论如何选择合适的加密…

【深度学习】PyTorch框架(3):优化与初始化

1.引言 在本文中&#xff0c;我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加&#xff0c;我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性&#xff0c;否则可能会遭遇梯度消失或梯度爆炸的问题。因此&#xff0c;我们将深入探讨以下两个核心概念&a…

Linux-mysql数据备份恢复

MySQL数据备份与恢复 一、备份介绍 1、为什么要备份 备份&#xff1a;能够防止由于机械故障以及人为误操作带来的数据丢失&#xff0c;例如将数据库文件保存在了其它地方。 冗余&#xff1a; 数据有多份冗余&#xff0c;但不等备份&#xff0c;只能防止机械故障带来的数据丢…

《JavaSE》---17.<String 类的常见操作>

目录 前言 一、String类的常见用法 1.1 字符串构造&#xff08;常见三种&#xff09; ①使用常量串构造 ②直接newString对象 ③ 使用字符数组进行构造 注意&#xff1a; 1.2 String对象的比较 1. 比较是否引用同一个对象 2. boolean equals(Object anObject) 方法&a…