首先,整体界面分三部分,最上层自定义ActionBar相信不需要我讲大家就能看出来了。

中间部分是文字动弹部分,主体就是一个设置了Padding(margin)的EditText,在EditText下面是一个剩余输入字数的描述。其实在“您还可以输入XX字”的左边还有一个用于显示录音图标的ImageView.

最下层是本文主要讲解的录音自定义控件的实现。

下面一整块整体都是自定义控件的区域,我将其命名为RecordButton,是一个继承自RelateiveLayout的ViewGroup。

在其中包括了左中右三个ImageView:试听与删除,中间的录音按钮。

在录音按钮的上下各有一个用于提示的TextView。

整体布局的载入可以通过调用 View.inflater(cxt, R.layout.xxx, null);就行了。

同前一篇讲的一样,作为控件界面控制逻辑,我们主要看一下onTouchEvent方法:当手指按下的时候,初始化录音器。手指在屏幕上移动的时候如果滑到按钮之上的时候,event.getY会返回一个负值(因为滑出控件了嘛)。这里我写的是-50主要是为了多一点缓冲,防止误操作。

先来看代码

@Override

public boolean onTouchEvent(MotionEvent event) {

if (mAudioFile == null) {

return false;

}

if (!mTouchInPlayButton) {

return false;

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

initBorderLine();

break;

case MotionEvent.ACTION_MOVE:

if (event.getY() < 0) {

viewToInit();

break;

}

if (event.getX() > mRightButtonX) {

mIsCancel = true;

scaleView(mImgDelete, 1.5f);

} else if (event.getX() < mLeftButtonX) {

scaleView(mImgListen, 1.5f);

} else {

mIsCancel = false;

viewToInit();

}

break;

case MotionEvent.ACTION_UP:

if (mIsCancel || event.getY() < -50) {

cancelRecord();

} else if (event.getX() < mLeftButtonX) {// 试听

playRecord();

finishRecord();

} else if (event.getX() > mRightButtonX) {// 删除

cancelRecord();

} else {

finishRecord();

}

viewToInit();

bottomFlag.setVisibility(View.VISIBLE);

topFlag.setVisibility(View.GONE);

mIsCancel = false;

mTouchInPlayButton = false;

break;

}

return true;

}

其中录音相关的工具类还是和之前的一样,这就是把功能与视图分开的好处,随时用随时复制粘贴过来就用了。

/**

* {@link #RecordButton}需要的工具类

*

* @author kymjs(http://www.kymjs.com/)

*/

public class RecordButtonUtil {

public static final String AUDOI_DIR = Environment

.getExternalStorageDirectory().getAbsolutePath() + "/oschina/audio"; // 录音音频保存根路径

private String mAudioPath; // 要播放的声音的路径

private boolean mIsRecording;// 是否正在录音

private boolean mIsPlaying;// 是否正在播放

private OnPlayListener listener;

// 初始化 录音器

private void initRecorder() {

mRecorder = new MediaRecorder();

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mRecorder.setOutputFile(mAudioPath);

mIsRecording = true;

}

/** 开始录音,并保存到文件中 */

public void recordAudio() {

initRecorder();

try {

mRecorder.prepare();

} catch (IOException e) {

e.printStackTrace();

}

mRecorder.start();

}

/** 获取音量值,只是针对录音音量 */

public int getVolumn() {

int volumn = 0;

// 录音

if (mRecorder != null && mIsRecording) {

volumn = mRecorder.getMaxAmplitude();

if (volumn != 0)

volumn = (int) (10 * Math.log(volumn) / Math.log(10)) / 7;

}

return volumn;

}

/** 停止录音 */

public void stopRecord() {

if (mRecorder != null) {

mRecorder.stop();

mRecorder.release();

mRecorder = null;

mIsRecording = false;

}

}

public void startPlay(String audioPath) {

if (!mIsPlaying) {

if (!StringUtils.isEmpty(audioPath)) {

mPlayer = new MediaPlayer();

try {

mPlayer.setDataSource(audioPath);

mPlayer.prepare();

mPlayer.start();

if (listener != null) {

listener.starPlay();

}

mIsPlaying = true;

mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

if (listener != null) {

listener.stopPlay();

}

mp.release();

mPlayer = null;

mIsPlaying = false;

}

});

} catch (Exception e) {

e.printStackTrace();

}

} else {

AppContext.showToastShort(R.string.record_sound_notfound);

}

} // end playing

}

public interface OnPlayListener {

/** 播放声音结束时调用 */

void stopPlay();

/** 播放声音开始时调用 */

void starPlay();

}

}

如果细心,你会发现左右两个圆形按钮,会随着手指移动到上面的时候放大,这其实也是一个通过监听ontouch事件,对两个圆形按钮设置动画产生的效果,和谐带人就是下面这句了。(注,setScaleX和setScaleY方法只有在API10,也就是3.0以上的版本才能调用):

if (event.getX() > mRightButtonX) {

mIsCancel = true;scaleView(mImgDelete, 1.5f);

} else if (event.getX() < mLeftButtonX) {

scaleView(mImgListen, 1.5f);

} else {

mIsCancel = false;viewToInit();

}

private void scaleView(View view, float scaleXY) {

if (android.os.Build.VERSION.SDK_INT > 10) {

view.setScaleX(scaleXY);

view.setScaleY(scaleXY);

}

}

总结

以上所述是小编给大家介绍的Android实现客户端语音动弹界面实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

android 语音交互动画,Android实现客户端语音动弹界面实例代码相关推荐

  1. Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!

    Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...

  2. android view存储为jpg,Android长按imageview把图片保存到本地的实例代码

    工具类 之前用 AsyncTask 现在改用rxJava public class SaveImageUtils { public static void imageSave(final ImageV ...

  3. android 语音搜索动画,Android自定义控件实现UC浏览器语音搜索效果

    最近项目上要实现语音搜索功能,界面样式要模仿一下UC浏览器的样式,UC浏览器中有一个控件,会随着声音大小浮动,然后寻思偷个懒,百度一下,结果也没有找到类似的,只能自己动手了. 先上图看我实现的效果: ...

  4. android view交替动画,Android View原理(View树遍历,View重绘,View动画)

    一.屏幕绘图基础 Android中的GUI系统是客户端和服务端配合的窗口系统,即后台运行了一个绘制服务,每个应用程序都是该服务端的一个客户端,当客户端需要绘制时,首先请求服务端创建一个窗口,然后在窗口 ...

  5. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  6. android局部翻转动画,android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  7. android 图片查看动画,Android 共享动画实现点击列表图片跳转查看大图页面

    主要内容使用系统提供的 API 实现共享动画 在实现过程中遇到的问题图片点击和关闭之后会出现短暂的黑屏问题实现的动画效果如下: 共享动画.gif 具体实现这个效果是在两个页面之间的切换动画,既然是两个 ...

  8. Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...

  9. android 上下扫描动画,Android扫描雷达动画

    很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...

最新文章

  1. 使用vue2.0 vue-router vuex 模拟ios7操作
  2. 设计模式总结——代理模式以及java的动态代理
  3. 与servlet Api 的集成
  4. python3读取excel数据-python3读取Excel表格数据的代码分享
  5. java如何定义一个字符栈_Java性能优化之字符串优化处理
  6. PostgreSQL的德哥教程
  7. boost::fusion::insert_range用法的测试程序
  8. dart系列之:HTML的专属领域,除了javascript之外,dart也可以
  9. leetcode1033. 移动石子直到连续
  10. Tensorflow快餐教程(6) - 矩阵分解
  11. java简单自定义Annotation
  12. 收藏 | 人脸识别最新进展
  13. 《Python编程从入门到实践》记录之字典遍历
  14. java 场景处理,最适合使用RxJava处理的四种场景
  15. labelme新版本的使用须知
  16. 多窗直播 截屏录制——UC问鼎全球首款直播浏览器
  17. ogg格式文件怎么转mp3格式
  18. 论文阅读《“The Boating Store Had Its Best Sail Ever”: Pronunciation-attentive ....》
  19. 如何批量一键下单寄快递
  20. 负反馈元器件参数对功放性能的影响

热门文章

  1. C#鼠标单双击事件区分
  2. C#之CAD二次开发实例 (13) 图层操作
  3. 海外新闻通稿发布时常见四大误区
  4. 易学笔记-系统分析师考试-第2章 经济管理与应用数学/2.6 IT审计相关常识/2.6.1 IT审计概述
  5. FatFs 常用 API 详细记录
  6. 有道云笔记无法同步 代理
  7. 产品资料准备—白皮书
  8. 《Deep Image Matting》论文笔记
  9. Accessing non-existent property ‘padLevels‘ of module
  10. 如何快速的找到动漫,电影资源