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


相关推荐: 如何正确下载安装西数主机建站助手?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel怎么在Blade中安全地输出原始HTML内容  简单实现jsp分页  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  微信小程序 wx.uploadFile无法上传解决办法  零服务器AI建站解决方案:快速部署与云端平台低成本实践  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何处理异常和错误?(Handler示例)  浅谈redis在项目中的应用  Laravel如何实现数据库事务?(DB Facade示例)  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  C++时间戳转换成日期时间的步骤和示例代码  如何在万网主机上快速搭建网站?  进行网站优化必须要坚持的四大原则  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Android中AutoCompleteTextView自动提示  免费视频制作网站,更新又快又好的免费电影网站?  Thinkphp 中 distinct 的用法解析  JS中对数组元素进行增删改移的方法总结  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何快速查询网站的真实建站时间?  如何用免费手机建站系统零基础打造专业网站?  Laravel如何使用模型观察者?(Observer代码示例)  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  nodejs redis 发布订阅机制封装实现方法及实例代码  HTML 中动态设置元素 name 属性的正确语法详解  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  中山网站推广排名,中山信息港登录入口?  如何彻底卸载建站之星软件?  jquery插件bootstrapValidator表单验证详解  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  使用spring连接及操作mongodb3.0实例  如何在IIS中新建站点并配置端口与物理路径?  Python文本处理实践_日志清洗解析【指导】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  PHP正则匹配日期和时间(时间戳转换)的实例代码  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel定时任务怎么设置_Laravel Crontab调度器配置  教你用AI将一段旋律扩展成一首完整的曲子