Android自定义控件实现UC浏览器语音搜索效果
发布时间 - 2026-01-11 00:46:42 点击率:次最近项目上要实现语音搜索功能,界面样式要模仿一下UC浏览器的样式,UC浏览器中有一个控件,会随着声音大小浮动,然后寻思偷个懒,百度一下,结果也没有找到类似的,只能自己动手了。

先上图看我实现的效果:
这是自定义控件的代码,里面注释也很明白,就不费话了
public class CustomCircleView extends View{
private Paint mPaint;
private int strokeWidth = 0; //圆环的宽度
private Bitmap bitmap = null; // 图片位图
private int nBitmapWidth = 0; // 图片的宽度
private int nBitmapHeight = 0; // 图片的高度
private int width; //view的宽度
private int height ; //view的高度
private int bigCircleColor =0; //view的高度
private int floatCircleColor =0; //view的高度
public CustomCircleView(Context context) {
this(context, null);
}
public CustomCircleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomCircleView, defStyleAttr, 0);
int n = a.getIndexCount();
for (int i = 0; i < n; i++)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.CustomCircleView_icon:
bitmap = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr, 0));
break;
case R.styleable.CustomCircleView_bigCircleColor:
bigCircleColor = a.getColor(attr, Color.GRAY);
break;
case R.styleable.CustomCircleView_floatCircleColor:
floatCircleColor = a.getColor(attr,Color.GREEN);
break;
}
}
a.recycle();
mPaint = new Paint();
//如果布局中没有设置bigCircleColor和floatCircleColor的时候给他一个默认值
if (bigCircleColor==0){
bigCircleColor=Color.parseColor("#FFEEF0F1");
}
if (floatCircleColor==0){
floatCircleColor=Color.parseColor("#25c1f5");
}
// 获取图片高度和宽度
nBitmapWidth = bitmap.getWidth();
nBitmapHeight = bitmap.getHeight();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//获取view的高度和宽度 这个view必须给精确值!!!!!!!!
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
}
if (heightMode == MeasureSpec.EXACTLY)
{
height = heightSize;
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setAntiAlias(true); // 消除锯齿
//绘制最外层灰色大圆
mPaint.setColor(bigCircleColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(height/2-nBitmapHeight/2);
//计算圆的半径稍微麻烦点,但是在图上画一下应该能明白 (height/2-nBitmapHeight/2)/2+nBitmapHeight/2
canvas.drawCircle(width/2, height/2, (height/2-nBitmapHeight/2)/2+nBitmapHeight/2, mPaint);
//绘制浮动的圆
mPaint.setColor(floatCircleColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(strokeWidth);
canvas.drawCircle(width/2, height/2, strokeWidth/2+nBitmapHeight/2, mPaint);
//绘制中间图标
canvas.drawBitmap(bitmap, width/2-nBitmapWidth/2, height/2-nBitmapHeight/2, mPaint);
}
//根据传入的宽度重新绘制
public void setStrokeWidth(int with){
this.strokeWidth=with;
invalidate();
}
}
在res/values 下建一个attrs文件 代码:
<resources>
<declare-styleable name="CustomCircleView">
<attr name="bigCircleColor" format="color" />
<attr name="floatCircleColor" format="color" />
<attr name="icon" format="reference" />
</declare-styleable>
</resources>
在布局中的使用:
<com.example.administrator.mycustomcircleview.CustomCircleView android:id="@+id/customView" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center" app:icon="@mipmap/voice_icon" app:floatCircleColor="@color/colorAccent" app:bigCircleColor="@color/colorPrimaryDark" />
高度宽度一定要给精确值,切记啊!!!颜色值可以不设定,默认就是我上面图的效果。
然后根据音量大小直接传入数值就可以了,很简单的使用方法,这里我用随机数代替了。
customView = ((CustomCircleView) findViewById(R.id.customView));
button = ((Button) findViewById(R.id.button));
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Random random=new Random();
customView.setStrokeWidth(random.nextInt(100));
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 语音
# 搜索
# 解决Android SearchView不显示搜索icon的问题
# Android开发之搜索框SearchView用法示例
# Android自定义View实现搜索框(SearchView)功能
# Android仿简书动态searchview搜索栏效果
# Android搜索框(SearchView)的功能和用法详解
# Android搜索框SearchView属性和用法详解
# Android SearchView搜索框组件的使用方法
# Android搜索框组件SearchView的基本使用方法
# 可支持快速搜索筛选的Android自定义选择控件
# Android SearchView搜索控件使用方法详解
# 这是
# 随机数
# 给他
# 也很
# 我用
# 看我
# 很简单
# 就是我
# 自定义
# 没有找到
# 话了
# 自己动手
# 大家多多
# 上要
# 就可以
# 搜索功能
# 图上
# 上图
# 有一个
# 默认值
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
,网页ppt怎么弄成自己的ppt?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何在橙子建站中快速调整背景颜色?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
Bootstrap整体框架之JavaScript插件架构
如何在云主机上快速搭建多站点网站?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何将凡科建站内容保存为本地文件?
bootstrap日历插件datetimepicker使用方法
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何在橙子建站上传落地页?操作指南详解
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
个人网站制作流程图片大全,个人网站如何注销?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
php打包exe后无法访问网络共享_共享权限设置方法【教程】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
jquery插件bootstrapValidator表单验证详解
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在建站之星绑定自定义域名?
如何在服务器上三步完成建站并提升流量?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
免费网站制作appp,免费制作app哪个平台好?
如何快速查询网址的建站时间与历史轨迹?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
教你用AI将一段旋律扩展成一首完整的曲子
如何快速生成ASP一键建站模板并优化安全性?
js代码实现下拉菜单【推荐】
如何在万网利用已有域名快速建站?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
高端企业智能建站程序:SEO优化与响应式模板定制开发
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
JS实现鼠标移上去显示图片或微信二维码
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
IOS倒计时设置UIButton标题title的抖动问题
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
如何在万网自助建站中设置域名及备案?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
jQuery中的100个技巧汇总

