当前位置: 首页 > 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();}}
http://www.lryc.cn/news/405479.html

相关文章:

  • VScode 修改 Markdown Preview Enhanced 字体以及大纲编号
  • TCP的FIN报文可否携带数据
  • 【GoF23种设计模式+简单工厂模式】
  • 北醒单点激光雷达更改id和波特率以及Ubuntu20.04下CAN驱动
  • 【线性代数】矩阵变换
  • 聚焦智慧出行,TDengine 与路特斯科技再度携手
  • 虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容
  • 【教程】vscode添加powershell7终端
  • 如何乘上第四次工业革命的大船
  • RKNN执行bash ./build-linux_RK3566_RK3568.sh 报错
  • Linux常用命令整理
  • python 闭包、装饰器
  • [pycharm]解决pycharm运行程序出现卡住scanning files to index索引的问题
  • python每日学习11:numpy库的用法(下)
  • 【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】
  • 6、基于Fabirc 2.X 通用电子存证系统部署
  • Linux Vim 由浅入深的教程
  • MIT6.824(6.5840) Lab1笔记+源码
  • 【目录】8051汇编与C语言系列教程
  • 群管机器人官网源码
  • 整合EasyExcel实现灵活的导入导出java
  • springSecurity学习之springSecurity web如何取得用户信息
  • eclipse中的classbean导入外部class文件,clean项目后删除问题
  • OBD诊断(ISO15031) 0A服务
  • ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防
  • Java——————接口(interface) <详解>
  • 【C++】【继承】【子对象】【构造函数】含子对象的派生类的构造函数写法
  • golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法
  • 深入浅出mediasoup—通信框架
  • 每日一题 LeetCode03 无重复字符的最长字串