自定义view之音量控制

2024-06-13 13:58
文章标签 自定义 view 音量控制

本文主要是介绍自定义view之音量控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近一直在学习自定义view,我是hongyang的一个小粉,hongyang老大也是我辈之楷模啊,奈何,自己太菜,只能一步一步的去攀爬了,下面的这个是学习hongyang老大的文章之一,加上自己的理解,练习一下:先看效果图:
效果图
首先是自定义的属性:

<resources><declare-styleable name="AudioControlView"><!--上方小块的颜色--><attr name="upCircleColor" format="color"></attr><!--下方小块的颜色--><attr name="downCircleColor" format="color"></attr><!--小块的间距--><attr name="splitSize" format="integer"></attr><!--小块的个数--><attr name="blockCount" format="integer"></attr><!--小块的宽度--><attr name="circleWidth" format="dimension"></attr><!--正中的图片--><attr name="centerPic" format="reference"></attr></declare-styleable></resources>

其次在布局文件中的属性值:

 <com.yinwei.definemyself.view.AudioControlViewandroid:layout_width="300dp"android:layout_height="300dp"app:blockCount="40"app:centerPic="@drawable/test"app:circleWidth="13dp"app:downCircleColor="@android:color/holo_red_light"app:splitSize="7"app:upCircleColor="@android:color/darker_gray" />

具体的实现代码:

public class AudioControlView extends View {private int mUpCircleColor, mDownCircleColor, mBlockCount, mSplitSize, mCircleWidth;private Bitmap mCenterImage;private Paint paint;private RectF rectF;private int mWidth, mHeight, mRadius, mcenter;private int mCurrentCount = 7;public AudioControlView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public AudioControlView(Context context) {this(context, null);}public AudioControlView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AudioControlView, defStyleAttr, 0);mUpCircleColor = a.getColor(R.styleable.AudioControlView_upCircleColor, Color.WHITE);mDownCircleColor = a.getColor(R.styleable.AudioControlView_downCircleColor, Color.BLACK);mBlockCount = a.getInt(R.styleable.AudioControlView_blockCount, 10);mSplitSize = a.getInt(R.styleable.AudioControlView_splitSize, 3);mCircleWidth = a.getDimensionPixelSize(R.styleable.AudioControlView_circleWidth,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 17, getResources().getDisplayMetrics()));mCenterImage = BitmapFactory.decodeResource(getResources(), a.getResourceId(R.styleable.AudioControlView_centerPic, 0));a.recycle();paint = new Paint();paint.setColor(mUpCircleColor);paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(7);rectF = new RectF();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int heightMode = MeasureSpec.getMode(heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int measureHeight = MeasureSpec.getSize(heightMeasureSpec);int measureWidth = MeasureSpec.getSize(widthMeasureSpec);if (heightMode == MeasureSpec.EXACTLY) {mHeight = measureHeight;//如果是确切的宽高,view就是测量的宽高,不考虑图片是否大于我们设定的宽高} else {mHeight = mCenterImage.getHeight() + getPaddingBottom() + getPaddingTop() + mCircleWidth;}if (widthMode == MeasureSpec.EXACTLY) {mWidth = measureWidth;} else {mWidth = mCenterImage.getWidth() + getPaddingRight() + getPaddingLeft() + mCircleWidth;}setMeasuredDimension(mWidth, mHeight);}@Overrideprotected void onDraw(Canvas canvas) {mcenter = Math.min(mWidth, mHeight) / 2;mRadius = mcenter - mCircleWidth / 2;rectF.top = mHeight / 2 - mRadius;rectF.left = mWidth / 2 - mRadius;rectF.right = mWidth / 2 + mRadius;rectF.bottom = mHeight / 2 + mRadius;float blockSize = (360 * 1.0f - mBlockCount * mSplitSize) / mBlockCount;//每个弧线的长度//绘制小弧线块for (int i = 0; i < mBlockCount; i++) {canvas.drawArc(rectF, i * (blockSize + mSplitSize), blockSize, false, paint);//false或者true 是否连接圆心,一般绘制扇形的时候是true}paint.setColor(mDownCircleColor);// canvas.drawArc();四个参数分别为:1:在什么范围之内绘制的矩形 2:绘制的起始弧度 3:绘制的弧度块的度数 4:画笔for (int i = 0; i < mCurrentCount; i++) {canvas.drawArc(rectF, i * (blockSize + mSplitSize), blockSize, false, paint);}//画图片int innerRadius = mRadius - mCircleWidth / 2; //除去绘制的部分的内切圆的半径大小Rect rect = new Rect();int innerRectHeght = (int) Math.sqrt(2) * innerRadius * 1 / 2;//内切圆中矩形的边长//在内切圆的半径大小下计算需要绘制的图片的矩形rect.left = mWidth / 2 - innerRectHeght;rect.top = mHeight / 2 - innerRectHeght;rect.right = mWidth / 2 + innerRectHeght;rect.bottom = mHeight / 2 + innerRectHeght;//如果图片的高度和宽度小于所绘制矩形的高度,以中心点放置图片if (mCenterImage.getHeight() < innerRectHeght && mCenterImage.getWidth() < innerRectHeght) {int rectWidth = Math.max(mCenterImage.getHeight(), mCenterImage.getWidth());rect.top = mHeight / 2 - rectWidth / 2;rect.left = mWidth / 2 - rectWidth / 2;rect.right = mWidth / 2 + rectWidth / 2;rect.bottom = mHeight / 2 + rectWidth / 2;}canvas.drawBitmap(mCenterImage, null, rect, paint);}}

嘿嘿,其他不说了,注释的比较详细,为了脱离贫困线而努力吧!~

这篇关于自定义view之音量控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057502

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Android13_SystemUI下拉框新增音量控制条

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改四、相关资源 一、必备知识 在Android12 版本上面已经完成了功能的实现,目前是在And

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 @CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDialog)是什么? CustomDialog是自定义弹窗,可用于广告、中