Android自定义控件实现UC浏览器语音搜索效果

 更新时间:2017年04月22日 14:26:33   作者:ludi  
这篇文章主要为大家详细介绍了Android自定义控件实现UC浏览器语音搜索效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

 最近项目上要实现语音搜索功能,界面样式要模仿一下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实现微信聊天语言点击喇叭动画效果

    这篇文章主要为大家详细介绍了Android实现微信聊天语言点击喇叭动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android 判断是否能真正上网的实例详解

    Android 判断是否能真正上网的实例详解

    这篇文章主要介绍了Android 判断是否能真正上网的实例详解相关资料,希望通过本文大家能够掌握判断是否上网的方法,需要的朋友可以参考下
    2017-10-10
  • Android仿QQ可拉伸头部控件

    Android仿QQ可拉伸头部控件

    这篇文章主要为大家详细介绍了Android仿QQ可拉伸头部控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Android Notes思码逸问题处理记录

    Android Notes思码逸问题处理记录

    这篇文章主要介绍了Android Notes思码逸问题处理记录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android实现仿excel数据表格效果

    Android实现仿excel数据表格效果

    这篇文章主要介绍了Android实现仿excel数据表格效果的实现代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Android日期选择控件使用详解

    Android日期选择控件使用详解

    这篇文章主要为大家详细介绍了Android日期选择控件的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Android TouchListener实现拖拽删实例代码

    Android TouchListener实现拖拽删实例代码

    这篇文章主要介绍了Android TouchListener实现拖拽删实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android端部署DeepSeek的详细教程

    Android端部署DeepSeek的详细教程

    DeepSeek最近几个月很火热,很多产品以及企业都在接入DeepSeek,比如微信搜索接入,可以搜索公众号信息并总结,这个对于查一些资料还挺好用,毕竟手机才是用户用的最多的,既然谈到了手机,那么DeepSeek能否部署于手机之上呢,本文给大家介绍了android端部署的DeepSeek方法
    2025-03-03
  • 详解Android Handler机制和Looper Handler Message关系

    详解Android Handler机制和Looper Handler Message关系

    Handler是Android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,准确的说是切换到构成Handler的looper所在的线程中去出处理。本文将详细介绍Android Handler机制和Looper Handler Message关系。
    2021-06-06
  • Android自定义view之利用drawArc方法实现动态效果(思路详解)

    Android自定义view之利用drawArc方法实现动态效果(思路详解)

    这篇文章主要介绍了Android自定义view之利用drawArc方法实现动态效果,drawArc方法包含了五个参数,具体细节在本文中给大家提到过,需要的朋友可以参考下
    2021-08-08

最新评论