我们常用的语音输入法会根据我们说话的大小产生一些波动动画,那么这个动画是怎么实现的呢?其实很简单。原理:一张空的麦克风图像,一张满的麦克风图像,先绘制一张空的,然后再绘制一些满的,但是满的绘制之前,有一个圆形的clip区域,这个区域就是用来显示满的显示多少。另外有点注意,有些手机要打开软件加速,不然clip区域显示的是方形的而不是圆形的,看起来的效果就悲剧了。

图片资源我用的是讯飞的图片,

这张是背景图,.9格式的。

看源码:

package com.voice.bdv;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.PaintFlagsDrawFilter;

import android.graphics.Path;

import android.graphics.Rect;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.View;

public class ClipCircleView extends View {

private Drawable empty;

private Drawable full;

Path path;

PaintFlagsDrawFilter filter;

public ClipCircleView(Context paramContext, AttributeSet attrs) {

super(paramContext, attrs);

setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 软件加速

}

public void init() {

try {

empty = MainActivity.getDrawable(getContext(), "voice_empty.png");

full = MainActivity.getDrawable(getContext(), "voice_full.png");

this.empty.setBounds(new Rect(-this.empty.getIntrinsicWidth() / 2,

-this.empty.getIntrinsicHeight() / 2, this.empty

.getIntrinsicWidth() / 2, this.empty

.getIntrinsicHeight() / 2));

this.full.setBounds(new Rect(-this.full.getIntrinsicWidth() / 2,

-this.full.getIntrinsicHeight() / 2, this.full

.getIntrinsicWidth() / 2, this.full

.getIntrinsicHeight() / 2));

filter = new PaintFlagsDrawFilter(Paint.ANTI_ALIAS_FLAG,

Paint.FILTER_BITMAP_FLAG);

path = new Path();

initPath(0);

} catch (Exception localException) {

localException.printStackTrace();

}

}

public void initPath(int paramInt) {

this.path.reset();

this.path.addCircle(0.0F, 0.0F, this.empty.getIntrinsicWidth()

* paramInt / 12, Path.Direction.CCW);

}

public void onDraw(Canvas paramCanvas) {

paramCanvas.save();

paramCanvas.setDrawFilter(filter);

paramCanvas.translate(getWidth() / 2, getHeight() / 2);

if (empty != null)

empty.draw(paramCanvas);

if (path != null)

paramCanvas.clipPath(path);

if (full != null)

full.draw(paramCanvas);

paramCanvas.restore();

}

public void finalize() throws Throwable {

this.empty = null;

this.full = null;

super.finalize();

}

protected void onMeasure(int paramInt1, int paramInt2) {

super.onMeasure(paramInt1, paramInt2);

int i = View.MeasureSpec.getSize(paramInt1);

int j = View.MeasureSpec.getSize(paramInt2);

Drawable localDrawable = getBackground();

if (localDrawable != null) {

i = localDrawable.getMinimumWidth();

j = localDrawable.getMinimumHeight();

}

setMeasuredDimension(resolveSize(i, paramInt1),

resolveSize(j, paramInt2));

}

}

以上是控件的源码,图片加载方法:

public static Bitmap getDrawable(Resources res, TypedValue value,

InputStream stream, Rect rect, BitmapFactory.Options options) {

if (options == null)

options = new BitmapFactory.Options();

if ((options.inDensity == 0) && (value != null)) {

int i = value.density;

if (i == 0)

options.inDensity = 160;

else if (i != 65535)

options.inDensity = i;

}

if ((options.inTargetDensity == 0) && (res != null))

options.inTargetDensity = res.getDisplayMetrics().densityDpi;

return BitmapFactory.decodeStream(stream, rect, options);

}

private static Drawable getDrawable(Resources res, Bitmap bitmap,

byte[] paramArrayOfByte, Rect rect, String path) {

if (paramArrayOfByte != null)

return new NinePatchDrawable(res, bitmap, paramArrayOfByte, rect,

path);

return new BitmapDrawable(res, bitmap);

}

public static Drawable getDrawable(Resources res, TypedValue value,

InputStream stream, String path, BitmapFactory.Options options) {

if (stream == null)

return null;

Rect rect = new Rect();

if (options == null)

options = new BitmapFactory.Options();

Bitmap bitmap = getDrawable(res, value, stream, rect, options);

if (bitmap != null) {

byte[] arrayOfByte = bitmap.getNinePatchChunk();

if ((arrayOfByte == null)

|| (!NinePatch.isNinePatchChunk(arrayOfByte))) {

arrayOfByte = null;

rect = null;

}

return getDrawable(res, bitmap, arrayOfByte, rect, path);

}

return null;

}

public static Drawable getDrawable(Context context, String path) {

try {

Resources res = context.getResources();

InputStream stream = context.getAssets().open(path);

TypedValue value = new TypedValue();

value.density = 240;

if (Build.VERSION.SDK_INT > 3) {

return getDrawable(res, value, stream, path, null);

}

return Drawable.createFromResourceStream(res, value, stream, path);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

以上加载图片方法可以自动加载.9格式的。

工程下载:bdvoice

android 麦克风 动画,录音麦克风动画效果相关推荐

  1. Android按下录音录音动画效果 ,自定义录音、播放动画View

    Android按下录音录音动画效果 ,自定义录音.播放动画View https://download.csdn.net/download/abc2522/10327428?spm=1001.2101. ...

  2. android录音波浪动画_Android语音输入的波浪效果 – WaveView

    效果展示 源码地址 实现思路 绘制正弦波形 水平移动波形,即可得到破浪效果. 正弦波形的绘制 private void createShader() { ... Bitmap bitmap = Bit ...

  3. android 麦克风 动画,Android实现直接播放麦克风采集到的声音

    本文实例讲述了Android实现直接播放麦克风采集到的声音.分享给大家供大家参考.具体如下: 这是一个直接播放麦克风采集到的声音线程类: class RecordThread extends Thre ...

  4. Android自绘控件开发与性能优化实践——以录音波浪动画为例

    前言 本文实战性较强,主要目的是通过一个自定义控件的开发,引出我对自定义控件性能优化的一些思考和实践,欢迎各位喜欢移动开发的小伙伴来拍砖~ 本文由于篇幅有限,只讲解思路,并没有放出大量源代码,如果对本 ...

  5. android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码

    Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...

  6. Android 动画之View动画效果和Activity切换动画效果

    View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...

  7. Android开发--图形图像与动画(三)--Animation效果的XML实现

    使用XML来定义Tween Animation 动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <trans ...

  8. Android动画开发——Animation动画效果

    动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...

  9. android刷新时的圆形动画_Android自定义加载圈动画效果

    本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...

最新文章

  1. Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
  2. php-nginx超时时间过短导致的post失败
  3. 使用PVRTexTool压缩纹理的基本用法
  4. 征战蓝桥 —— 2013年第四届 —— C/C++A组第5题——前缀判断
  5. “既然计划没有变化快,那制订计划还有个卵用啊!”
  6. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
  7. mysql中的内置函数
  8. 基于Spring+SpringMVC+Mybatis架构的开源博客
  9. 硬盘清零工具_WinHex使用方法与使用WinHex恢复硬盘实例
  10. 【Flink】Flink 单个任务 多个流的消费同一个topic的时候其中一个流卡死 不消费
  11. Android斗地主源码实现
  12. kafka 新加入副本_Apache-Kafka 核心组件和流程-控制器
  13. 试用版本重装系统才能用是怎么回事_电脑重装系统老是失败,到底是怎么回事?这种现象是第一次碰到!...
  14. 自建电驴服务器,电驴服务器怎么连接 eMule连接服务器教程
  15. PPT动态文字制作过程
  16. Riot Game前高管:游戏玩家将成为Web3真正粉丝的15大原因
  17. Theos-tweak工程
  18. Linux下安装小企鹅输入法
  19. 两个for循环写出大小写字母表
  20. nodejs调用SendCloud邮件API2.0

热门文章

  1. 地理坐标系VS大地坐标系
  2. 数论-Lucas(卢卡斯定理)
  3. 详解JSP 中Spring工作原理及其作用
  4. iPhone12mini跟iPhone6哪个大
  5. 关于Twitter Card的一个巨坑
  6. 安装ubuntu8.04。。。。
  7. 学计算机投影仪定义,一种计算机教学用投影仪射头的制作方法
  8. 《液晶显示器和液晶电视维修核心教程》——第1章 液晶显示器维修概要1.1 液晶显示器的基本知识...
  9. Redis 6.0删除节点
  10. 本周最新文献速递20220522