android 麦克风 动画,录音麦克风动画效果
我们常用的语音输入法会根据我们说话的大小产生一些波动动画,那么这个动画是怎么实现的呢?其实很简单。原理:一张空的麦克风图像,一张满的麦克风图像,先绘制一张空的,然后再绘制一些满的,但是满的绘制之前,有一个圆形的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 麦克风 动画,录音麦克风动画效果相关推荐
- Android按下录音录音动画效果 ,自定义录音、播放动画View
Android按下录音录音动画效果 ,自定义录音.播放动画View https://download.csdn.net/download/abc2522/10327428?spm=1001.2101. ...
- android录音波浪动画_Android语音输入的波浪效果 – WaveView
效果展示 源码地址 实现思路 绘制正弦波形 水平移动波形,即可得到破浪效果. 正弦波形的绘制 private void createShader() { ... Bitmap bitmap = Bit ...
- android 麦克风 动画,Android实现直接播放麦克风采集到的声音
本文实例讲述了Android实现直接播放麦克风采集到的声音.分享给大家供大家参考.具体如下: 这是一个直接播放麦克风采集到的声音线程类: class RecordThread extends Thre ...
- Android自绘控件开发与性能优化实践——以录音波浪动画为例
前言 本文实战性较强,主要目的是通过一个自定义控件的开发,引出我对自定义控件性能优化的一些思考和实践,欢迎各位喜欢移动开发的小伙伴来拍砖~ 本文由于篇幅有限,只讲解思路,并没有放出大量源代码,如果对本 ...
- android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码
Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...
- Android 动画之View动画效果和Activity切换动画效果
View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...
- Android开发--图形图像与动画(三)--Animation效果的XML实现
使用XML来定义Tween Animation 动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <trans ...
- Android动画开发——Animation动画效果
动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...
- android刷新时的圆形动画_Android自定义加载圈动画效果
本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...
最新文章
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
- php-nginx超时时间过短导致的post失败
- 使用PVRTexTool压缩纹理的基本用法
- 征战蓝桥 —— 2013年第四届 —— C/C++A组第5题——前缀判断
- “既然计划没有变化快,那制订计划还有个卵用啊!”
- bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
- mysql中的内置函数
- 基于Spring+SpringMVC+Mybatis架构的开源博客
- 硬盘清零工具_WinHex使用方法与使用WinHex恢复硬盘实例
- 【Flink】Flink 单个任务 多个流的消费同一个topic的时候其中一个流卡死 不消费
- Android斗地主源码实现
- kafka 新加入副本_Apache-Kafka 核心组件和流程-控制器
- 试用版本重装系统才能用是怎么回事_电脑重装系统老是失败,到底是怎么回事?这种现象是第一次碰到!...
- 自建电驴服务器,电驴服务器怎么连接 eMule连接服务器教程
- PPT动态文字制作过程
- Riot Game前高管:游戏玩家将成为Web3真正粉丝的15大原因
- Theos-tweak工程
- Linux下安装小企鹅输入法
- 两个for循环写出大小写字母表
- nodejs调用SendCloud邮件API2.0