做过的自定义 View
做过的自定义 View
音频条状图
需求
最终效果类似于音频图中的条状图
只是效果模拟,并不监听真实的音频
条的宽度相同,高度随机;条的颜色是红到黄的线性渐变
随着时间的变化,条的高度发生变化
详细设计
自定义属性
条的宽度(默认 3dp)
条的颜色变化范围(两个颜色——默认红色、橙色)
条之间的间距
整个 View 的背景颜色
变化的频率,单位是毫秒
处理起始绘制的坐标,并结合条间距计算 View 能显示多少个条。计算方法:条的总数 = (View 的宽度 - 条间距 * 2) / (条的宽度 + 条间距)
随机生成条的高度,高度的范围:[1, 控件的高度]
条的颜色在两个颜色之间,随时间呈线性梯度变化
具体实现
定义自定义属性(res/values/attrs.xml):
<declare-styleable name="AudioBarChart">
<attr name="barWidth" format="reference|dimension" /><!-- 条的宽度,默认 3dp -->
<attr name="barStartColor" format="reference|color" /><!-- 条颜色的起始值,默认红色 -->
<attr name="barEndColor" format="reference|color" /><!-- 条颜色的结束值,默认橙色 -->
<attr name="barSpace" format="reference|dimension" /><!-- 条间距,默认 1dp -->
<attr name="wholeBgColor" format="reference|color" /><!-- 整个的背影颜色,默认白色 -->
<attr name="changeFrenquency" format="integer" /><!-- 条变化的频率,单位毫秒,默认 300 -->
</declare-styleable>
获取自定义属性并指定默认值:
public AudioBarChart(Context context, AttributeSet attrs) {
super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AudioBarChart); mBarWidth = (int) typedArray.getDimension(R.styleable.AudioBarChart_barWidth, 20);
mBarStartColor = typedArray.getColor(R.styleable.AudioBarChart_barStartColor, getResources().getColor(R.color.audio_bar_chart_red));
mBarEndColor = typedArray.getColor(R.styleable.AudioBarChart_barEndColor, getResources().getColor(R.color.audio_bar_chart_orange));
mBarSpace = (int) typedArray.getDimension(R.styleable.AudioBarChart_barSpace, 5);
mWholeBgColor = typedArray.getColor(R.styleable.AudioBarChart_wholeBgColor, getResources().getColor(android.R.color.white));
mChangeFrequency = typedArray.getInt(R.styleable.AudioBarChart_changeFrenquency, 300); typedArray.recycle();
}
测量并初始化变量值:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(mWidth, mHeight); mBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBarPaint.setStyle(Paint.Style.FILL); mBarCount = (mWidth - mBarSpace * 2) / (mBarWidth + mBarSpace);
}
绘制:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); setBackgroundColor(mWholeBgColor);
for (int i = 0; i < mBarCount; i++) {
int height = mHeight - new Random().nextInt(mHeight * 3 / 4);
int x = (i + 1) * mBarSpace + i * mBarWidth;
Rect rect = new Rect(x, height, x + mBarWidth, mHeight);
mLinearGradient = new LinearGradient(x, mHeight, x + mBarWidth, height, mBarStartColor, mBarEndColor, Shader.TileMode.CLAMP);
mBarPaint.setShader(mLinearGradient);
canvas.drawRect(rect, mBarPaint);
}
postInvalidateDelayed(mChangeFrequency);
}
最终效果:
做过的自定义 View的更多相关文章
- 自定义view(一)
为什么标题会是自定义view(一)呢?因为自定义view其实内容很多,变化也很多,所以我会慢慢更新博客,争取多写的有关的东西,同时,如果我以后学到了新的有关于自定义view的东西,我也会及时写出来. ...
- 手把手带你做一个超炫酷loading成功动画view Android自定义view
写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...
- Android之自定义View的实现
对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...
- 通过圆形载入View了解自定义View
这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...
- salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List
salesforce给我们提供了标准的页面,比如标准的页面包括标准的列表和标准的详细页视图.有的时候我们想要自定义视图,比如做一个项目的时候不希望使用者直接通过ID查看到标准的详细页,而是跳转到指定处 ...
- Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)
Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框) Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...
- 自定义View其实很简单系列1-12
作者: AigeStudio http://blog.csdn.net/aigestudio 说明:文中的1/12表示12篇中的第1篇, 1/6=2/12表示12篇中的第2篇,其它类似. 自定义控件 ...
- Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
- Android自定义View的三种实现方式
在毕设项目中多处用到自定义控件,一直打算总结一下自定义控件的实现方式,今天就来总结一下吧.在此之前学习了郭霖大神博客上面关于自定义View的几篇博文,感觉受益良多,本文中就参考了其中的一些内容. 总结 ...
随机推荐
- SQL Server 2005/2008备份数据库时提示“无法打开备份设备”
错误描述: 今天备份sqlserver 2008数据库时候,想要将备份文件放在f盘的根目录下,结果提示如下信息:备份对于服务器“服务器名”失败.(Microsoft.SqlServer.Smo)其他信 ...
- Struts2-Spring和Hibernate整合
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用.作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用.功能齐全的标志库(Tag Libr ...
- iOS Mapkit 定位REGcode地理位置偏移
在iOS上,使用系统Mapkit定位,获取到的坐标会有偏移: 今有需求,用系统Mapkit定位,并Regcode出实际地理位置,修正偏移: 解决方案: 使用MapView的代理 - (void)map ...
- pip运行报错Fatal error in launcher: Unable to create process using pip.exe
使用pip的时候报错Fatal error in launcher: Unable to create process using pip.exe 解决办法,升级pip python -m pip i ...
- onWindowFocusChanged重要作用(得到/失去焦点call) 、
onWindowFocusChanged重要作用 Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onW ...
- dmesg 时间转换脚本
https://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable perl脚本 #!/usr/bin/perl use ...
- Tomcat日志、项目中的log4j日志、控制台——我的日志最后到底跑哪去了?
1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...
- hibernate 一对多双向
package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...
- C# EF使用性能消耗列表 https://msdn.microsoft.com/zh-cn/library/cc853327.aspx
性能注意事项(实体框架) .NET Framework (current version) 其他版本 本主题介绍 ADO.NET 实体框架的性能特征,并提供一些注意事项帮助改善实体框架应用程序 ...
- Excel 时间格式相减
https://jingyan.baidu.com/article/3065b3b6e8b9dabecff8a4d6.html datedif函数是excel的隐藏函数,主要用于计算日期之差,不是四舍 ...