Android 视频亮度图标

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

<?xml version="1.0" encoding="utf-8"?>
<resources><!--图标颜色--><attr name="ijkSolid" format="color|reference" /><!--圆角大小--><attr name="ijkRadius" format="dimension|reference" /><!--线条长度--><attr name="ijkLineLength" format="dimension|reference" /><!--线条和圆圈间距--><attr name="ijkGap" format="dimension|reference" /><!--线条宽度--><attr name="ijkLineWidth" format="dimension|reference" /><!--视频亮度--><declare-styleable name="VideoBrightness"><!--图标颜色--><attr name="ijkSolid" /><!--圆角大小--><attr name="ijkRadius" /><!--线条长度--><attr name="ijkLineLength" /><!--线条和圆圈间距--><attr name="ijkGap" /><!--线条宽度--><attr name="ijkLineWidth" /></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/web/46894.shtml

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

相关文章

防火墙内容安全综合实验

一、实验拓扑 二、实验要求 1&#xff0c;假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2&#xff0c;我们需要针对办公区用户进行上网行为管理&#xff0c;要…

区块链革命:探索Web3如何重塑数字世界

随着区块链技术的不断发展和应用&#xff0c;Web3作为其重要的应用范式&#xff0c;正以其去中心化、安全和可编程性质&#xff0c;深刻影响和重塑着我们的数字世界。本文将深入探讨Web3的核心概念、关键特征以及其在重塑数字世界中的应用和影响&#xff0c;为读者揭示区块链革…

黑马微服务拆分2 (路由 登录 配置)

会利用微服务网关做请求路由 会利用微服务网关做登录身份校验 会利用Nacos实现统一配置管理 会利用Nacos实现配置热更新 今天粗略的完成了黑马笔记里边的代码实现 其实本身黑马商城的源码就写的逻辑有漏洞&#xff0c;加上对业务没有仔细分析 导致出现的bug调试了很久 这…

【入门】基于DE2-115的My First FPGA 工程

1.1. 概述 这是一个简单的练习&#xff0c; 可以帮助初学者开始了解如何使用Intel Quartus 软件进行 FPGA 开发。 在本章节中&#xff0c;您将学习如何编译 Verilog 代码&#xff0c;进行引脚分配&#xff0c;创建时序约束&#xff0c;然后对 FPGA 进行编程&#xff0c;驱动开…

SpringBoot连接PostgreSQL+MybatisPlus入门案例

项目结构 一、Java代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…

npm 缓存目录

npm&#xff08;Node Package Manager&#xff09;的缓存目录是npm用于存储已下载包的本地位置&#xff0c;以便在后续安装相同包时能够快速复用&#xff0c;从而节省时间和带宽。npm缓存目录的具体位置会根据操作系统的不同而有所差异。 Windows系统 在Windows系统中&#x…

打造智慧图书馆:AI视频技术助力图书馆安全与秩序管理

一、背景需求 随着信息技术的飞速发展&#xff0c;图书馆作为重要的知识传播场所&#xff0c;其安全管理也面临着新的挑战。为了确保图书馆内书籍的安全、维护读者的阅读环境以及应对突发事件&#xff0c;TSINGSEE青犀旭帆科技基于EasyCVR视频监控汇聚平台技术与AI视频智能分析…

2024可信数据库发展大会:TDengine CEO 陶建辉谈“做难而正确的事情”

在当前数字经济快速发展的背景下&#xff0c;可信数据库技术日益成为各行业信息化建设的关键支撑点。金融、电信、能源和政务等领域对数据处理和管理的需求不断增加&#xff0c;推动了数据库技术的创新与进步。与此同时&#xff0c;人工智能与数据库的深度融合、搜索与分析型数…

CH04_依赖项属性

第4章&#xff1a;依赖项属性 本章目标 理解依赖项属性理解属性验证 依赖项属性 ​ 属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性&#xff08;Dependency Property&#xff09;功能来替换原来.NET的属性&#xff0c;实现了更高效率的保存机制&#xf…

Android GWP-Asan使用与实现原理

目录 一、 背景 二、GWP-Asan介绍 2.1 什么是GWP-ASan 2.2 GWP-Asan与其他几类工具对比 2.3 GWP-ASan与其它内存分配器的兼容性 三、GWP-Asan如何使用 3.1 app进程 3.2 native进程 四、GWP-Asan实现原理 4.1 进程启用GWP-Asan 4.2 初始化 4.3 内存分配 4.3.1 内存…

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨&#xff0c;美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”&#xff0c;即GPT-4o的更小参数量、简化版本。OpenAI表示&#xff0c;GPT-4o mini是目前功能最强大、性价比最高的小参数模型&#xff0c;性能逼近原版GPT-4&#xff0…

【React】使用 antd 加载组件实现 iframe 的加载效果

文章目录 代码实现&#xff1a; import { Spin } from antd; import { useState } from react;export default function () {const [loading, setLoading] useState(true);return (<div style{{ position: relative, height: 100% }}><Spinstyle{{ position: absolu…

CH01_WPF概述

第1章&#xff1a;WPF概述 本章目标 了解Windows图形演化了解WPF高级API了解分辨率无关性概念了解WPF体系结构了解WPF 4.5 WPF概述 ​ 欢迎使用 Windows Presentation Foundation (WPF) 桌面指南&#xff0c;这是一个与分辨率无关的 UI 框架&#xff0c;使用基于矢量的呈现引…

微服务之间Feign调用

需使用的服务 FeignClient(name "rdss-back-service", fallback SysUserServiceFallback.class, configuration FeignConfiguration.class) public interface SysUserService {/*** 订单下单用户模糊查询*/GetMapping(value "/user/getOrderUserName")…

Linux云计算 |【第一阶段】ENGINEER-DAY4

主要内容&#xff1a; 配置Linux网络参数、配置静态主机名、查看/修改/激活/禁用网络连接、指定DNS、虚拟网络连接、虚拟机克隆、SSH客户端、SCP远程复制、SSH无密码验证&#xff08;SERVICE-DAY5&#xff09;、虚拟网络类型 一、网络参数配置 修改网卡配置文件主要是需要配置…

农田自动化闸门的结构组成与功能解析

在现代化的农业节水灌溉领域中&#xff0c;农田自动化闸门的应用越来越广泛。它集成了先进的技术&#xff0c;通过自动化控制实现水资源的精准调度和高效利用。本文将围绕农田自动化闸门的结构组成&#xff0c;详细介绍其各个部件的功能和特点。 农田自动化闸门主要由闸门控制箱…

为什么音频的采样率是44.1K不是40K也不是42K

为什么音频的采样率是44.1K不是40K 根据奈奎斯特采样理论&#xff0c;采样频率必须是信号最高频率的两倍&#xff0c;才能保证较好地还原原始信号。音频信号的频率一般达到20Hz&#xff0c;而人耳收听的范围大约是20Hz到23kHz以下。为了满足人耳的听觉要求&#xff0c;需要保留…

游戏外挂的技术实现与五年脚本开发经验分享

引言&#xff1a; 在数字娱乐的浪潮中&#xff0c;电子游戏成为许多人生活中不可或缺的一部分。然而&#xff0c;随着游戏的普及&#xff0c;一些玩家为了追求更高效的游戏体验或不正当竞争优势&#xff0c;开始使用游戏外挂程序。这些外挂往往通过修改游戏正常运行机制来提供非…

STM32智能农业灌溉系统教程

目录 引言环境准备智能农业灌溉系统基础代码实现&#xff1a;实现智能农业灌溉系统 4.1 数据采集模块 4.2 数据处理与决策模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系…

河南萌新联赛2024第(一)场:河南农业大学 A D F G H I K

A 造数 题目描述&#xff1a; 给定一个整数 &#x1d45b; &#xff0c;你可以进行以下三种操作 操作1&#xff1a; 1 操作2&#xff1b; 2 操作3&#xff1a; 2 问最少需要多少次操作可以将 0 转为为 &#x1d45b; 。 解题思路 操作1&#xff0c;2&#xff0c;3。操作 3 …