Android 视频亮度图标

news2024/12/22 18:08:08

在这里插入图片描述
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);
    }

    @Override
    protected 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;
    }

    @Override
    protected 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.coloradmin.cn/o/1936652.html

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

相关文章

《Linux运维总结:基于ARM64架构CPU使用docker-compose一键离线部署单机版tendis2.4.2》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面对不同的客户部署业务系统&#xff0…

CSRF+XSS组合攻击实战

目录 0x01安装靶场 0x02分析功能点的请求接口&#xff0c;构造恶意请求 0x03寻找xss漏洞 0x01安装靶场 下载源码&#xff0c;解压到网站根目录 1.修改数据库配置文件 打开源码&#xff0c;进入到include目录下&#xff0c;打开数据库配置文件database.inc.php 将数据库的…

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 内存…

Proxyman for Mac v5.6.1 抓包调试工具

Mac分享吧 文章目录 效果一、下载软件二、功能三、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 四、运行测试1、打开软件 安装完成&#xff01;&#xff01;&#xff01; 效果 一…

开源模型应用落地-FastAPI-助力模型交互-进阶篇(四)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

【Linux服务器Java环境搭建】012在linux中安装消息队列RabbitMQ,以及对RabbitMQ设置、启动、开启可视化

系列文章目录 【Linux服务器Java环境搭建】 前言 上一篇博客竟然用了不到半小时就写完了&#xff0c;那就继续吧&#xff0c;如果对此系列感兴趣&#xff0c;可以点击系列【Linux服务器Java环境搭建】进行查看哈&#xff0c;这一篇主要是安装和配置消息队列RabbitMQ。 一、消…

Easysearch、Elasticsearch、Amazon OpenSearch 快照兼容对比

启动集群 Easysearch sysctl -w vm.max_map_count262144Amazon OpenSearch Elasticsearch 由于这个docker compose没有关于kibana的配置&#xff0c;所以我们还是用Console添加原生的Elasticsearch集群 集群信息 快照还原的步骤 快照前的准备 插件安装 本次测试选择把索…

力扣1696.跳跃游戏 VI

力扣1696.跳跃游戏 VI 递推 class Solution {public:int maxResult(vector<int>& nums, int k) {int n nums.size();vector<int> f(n);f[0] nums[0];for(int i1;i<n;i)f[i] *max_element(f.begin() max(i-k,0),f.begin() i) nums[i];return f[n-1];}…

【Manim动画教程】——基本几何 【弧-上】

1.标注点&#xff08;AnnotationDot&#xff09; 具有较大半径和粗体笔触的点&#xff0c;用于注释场景。 class AnnotationDot(radius0.10400000000000001, stroke_width5, stroke_colorManimColor(#FFFFFF), fill_colorManimColor(#58C4DD), **kwargs) 实例代码&#xff…

npm install报错:npm error ERESOLVE could not resolve

从git上拉取一个新vue项目下来&#xff0c;在npm install时报错&#xff1a;npm error ERESOLVE could not resolve 有网友分析原因是因为依赖冲突导致报错&#xff0c;解决方法如下&#xff1a; # --legacy-peer-deps&#xff1a;安装时忽略所有peerDependencies&#xff0c…

Serverless技术的市场调研与发展分析

目录 一、 Serverless基础 1.1 Serverless产生的背景 1.2 什么是Serverless 1.3 Serverless架构优势 1.3.1 按需使用的资源管理 1.3.2 简化业务运维复杂度 1.4 Serverless和Service Mesh相同点 1.5 Serverless基础架构 1.5.1 函数管理 1.5.2 事件触发器 1.5.3 函数的…

加载数据集(Dataset and Dataloader)

dataset主要是用于构造数据集&#xff08;支持索引&#xff09;&#xff0c;dataloader可以拿出一个mini-batch供我们快速使用。 一&#xff1a;上一节知识 一下是我们上一节提到的糖尿病数据集&#xff0c;其中在提到数据加载的时候&#xff0c;我们没有使用mini-batch的方法…

Linux系统下载htop

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、在Debian/Ubuntu上安装htop1.1更新包列表1.2 安装htop 二、在CentOS/RHEL上安装htop2.1.启用EPEL仓库2.2 安装htop 三、在Fedora上安装htop3.1.安装htop 四…

GraphRAG+ollama+LM Studio+chainlit

这里我们进一步尝试将embedding模型也换为本地的&#xff0c;同时熟悉一下流程和学一些新的东西 1.环境还是用之前的&#xff0c;这里我们先下载LLM 然后你会在下载nomic模型的时候崩溃&#xff0c;因为无法搜索&#xff0c;无法下载 解决办法如下lm studio 0.2.24国内下载…

升级pnpm 升级node.js 解决安装nodejs多版本时显示 is not yet released or available

第一部分&#xff1a;升级pnpm 1、使用命令查看本地安装的pnpm版本 pnpm -v2 使用命令安装指定版本的pnpm npm install -g pnpm8.9.0也可以使用以下命令安装最新版本的pnpm: npm install -g pnpmlatest安装后可以使用pnpm -v 查看是否升级成功 第二部分&#xff1a;升级n…

非线性支持向量机(SVM)

理论知识推导 支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。在处理非线性数据时&#xff0c;线性SVM可能无法很好地分离数据。为了解决这个问题&#xff0c;我们使用核函数将低维空间的非线性数据映射到高维空间&#xff0c;使得在高维空间…

邵楠:数据湖存储的现状和未来趋势

近几年数据湖的概念非常火热&#xff0c;但是数据湖的定义并不统一&#xff0c;我们先看下数据湖的相关定义。 Wikipedia对数据湖的定义&#xff1a; 数据湖是指使用大型二进制对象或文件这样的自然格式储存数据的系统。它通常把所有的企业数据统一存储&#xff0c;既包括源系…

生产力工具|Endnote 21 Macwin版本安装

一、软件下载&#xff1a; &#xff08;一&#xff09;mac版本 Endnote 21版本下载&#xff1a;点击下载 Endnote 20版本下载&#xff1a;点击下载 Endnote X9版本下载&#xff1a;点击下载 &#xff08;二&#xff09;Endnote 20 Win版本 第一步&#xff1a;安装好官网软…

分享:一次性查找多个PDF文件,如何根据txt文本列出的文件名批量查找指定文件夹里的文件,并复制到新的文件夹,不需要写任何代码,点点鼠标批量处理一次性搞定

简介&#xff1a; 该文介绍了一个批量查找PDF文件&#xff08;不限于找PDF&#xff09;的工具&#xff0c;用于在多级文件夹中快速查找并复制特定文件。用户可以加载PDF库&#xff0c;输入文件名列表&#xff0c;设置操作参数&#xff08;如保存路径、复制或删除&#xff09;及…

树莓派4B从装系统raspbian到vscode远程编程(python)

1、写在前面 前面用的一直是Ubuntu系统&#xff0c;但是遇到一个奇葩的问题&#xff1a; 北通手柄在终端可以正常使用&#xff0c;接收到数据 但在python程序中使用pygame库初始化时总是报错&#xff1a;Invalid device number&#xff0c;检测不到手柄 经过n次重装系统&am…