Android——实现微信语音音量变化说话
来源:互联网 发布:emergency mode ubuntu 编辑:程序博客网 时间:2024/04/29 13:40
先上图:
这里将绑定下面的Button和Dialog,当然使用的是自定义View。
完了会附代码。
用代码说话:自定义Button
public class AudioButton extends Button { private static final int DISTANCE_Y_CANCEL = 50; private static final int STATE_NORMAL = 1; private static final int STATE_RECODING = 2; private static final int STATE_WANT_TO_CANCEL = 3; private static final int STATE_TOO_SHORT = 4; private int curState = STATE_NORMAL; private boolean isRecoding; private DialogManager dialogmanager;//用来管理dialog public void setRecoding(boolean isRecoding) { this.isRecoding = isRecoding; } public boolean isRecoding() { return isRecoding; } public DialogManager getDialogmanager() { return dialogmanager; } public void setDialogmanager(DialogManager dialogmanager) { this.dialogmanager = dialogmanager; } public AudioButton(Context context) { this(context, null); // TODO Auto-generated constructor stub } public AudioButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub dialogmanager = new DialogManager(getContext()); setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { // TODO Auto-generated method stub // dialogmanager.showRecodingDialog(); // isRecoding=true; return false; } }); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub int action = event.getAction(); int x = (int) event.getX(); int y = (int) event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: isRecoding = true; changeState(STATE_RECODING); break; case MotionEvent.ACTION_MOVE: if (isRecoding) { // 根据x,y的坐标是否取消 if (wantToCancel(x, y)) { changeState(STATE_WANT_TO_CANCEL); } else { changeState(STATE_RECODING); } } break; case MotionEvent.ACTION_UP: if (curState == STATE_RECODING) { } else if (curState == STATE_WANT_TO_CANCEL) { // cancel } dialogmanager.dimissRecodingDialog(); reset(); break; default: break; } return super.onTouchEvent(event); } /** * 恢复标志位,状态 */ private void reset() { // TODO Auto-generated method stub isRecoding = false; changeState(STATE_NORMAL); } private boolean wantToCancel(int x, int y) { // TODO Auto-generated method stub if (x < 0 || x > getWidth()) { return true; } if (y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL) { return true; } return false; } private void changeState(int state) { // TODO Auto-generated method stub if (curState != state) { curState = state; switch (state) { case STATE_NORMAL: setText("按住 说话"); break; case STATE_RECODING: setText("松开 结束"); if (isRecoding) { // dialog recording dialogmanager.recoding(); } break; case STATE_WANT_TO_CANCEL: setText("松开手指,取消发送"); // dialog cancel dialogmanager.wanToCancel(); break; case STATE_TOO_SHORT: setText("录音时间过短!"); dialogmanager.tooShort(); break; default: break; } } }}
DialogManager管理Dialog:
public class DialogManager { private Dialog dialog; private ImageView icon,voice; private Context context; private TextView lable; public DialogManager (Context context) { this.context=context; } public void showRecodingDialog() { dialog=new Dialog(context, R.style.Theme_AudioDialog); dialog.setContentView(R.layout.dialog_manager); icon=(ImageView) dialog.findViewById(R.id.dialog_maik); voice=(ImageView) dialog.findViewById(R.id.dialog_voice); lable=(TextView) dialog.findViewById(R.id.dialog_lable); dialog.show(); } public void recoding() { if(dialog!=null&&dialog.isShowing()) { icon.setVisibility(View.VISIBLE); voice.setVisibility(View.VISIBLE); lable.setVisibility(View.VISIBLE); icon.setImageResource(R.drawable.recorder); lable.setText("手指上滑,取消发送"); } } public void dimissRecodingDialog() { if(dialog!=null&&dialog.isShowing()) { dialog.dismiss(); dialog=null; } } public void wanToCancel() { if(dialog!=null&&dialog.isShowing()) { icon.setVisibility(View.VISIBLE); voice.setVisibility(View.GONE); lable.setVisibility(View.VISIBLE); icon.setImageResource(R.drawable.cancel); lable.setText("松开手指,取消发送"); } } public void tooShort() { if(dialog!=null&&dialog.isShowing()) { icon.setVisibility(View.VISIBLE); voice.setVisibility(View.GONE); lable.setVisibility(View.VISIBLE); icon.setImageResource(R.drawable.voice_to_short); lable.setText("录音时间过短!"); } } /** * 通过level来显示声音图片的更新 * @param level */ public void updateVoice(int level) { if(dialog!=null&&dialog.isShowing()) { icon.setVisibility(View.VISIBLE); voice.setVisibility(View.VISIBLE); lable.setVisibility(View.VISIBLE); int resId=context.getResources().getIdentifier("v"+level, "drawable", context.getPackageName()); voice.setImageResource(resId); } }}
这里为了方便 音量图片命名有规则更好一点v1-v7:
style:
<style name="Theme_AudioDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:backgroundDimEnabled">false</item> </style>
附一下资源文件:
res文件
在主界面可以用audiobutton.getDialogmanager()来获取dialog对象调用里面的方法。
阅读全文
0 0
- Android——实现微信语音音量变化说话
- QQ和微信语音音量分析
- android实现微信语音功能
- Android监听音量变化
- 微信按住说话HTML实现
- Android音乐播放器SeekBar控制音量变化的实现
- Android 微信语音功能
- Android 实现长按录音获取实时音量显示图片(类似微信)
- Android 实现长按录音获取实时音量显示图片(类似微信)
- 语音说话
- FAQ11272][Audio App]微信语音通话(听筒模式),音量侧键不能调音量
- AS 实现微信语音聊天
- 微信语音连播的实现思路
- Android模仿微信语音聊天功能
- Android 仿QQ/微信语音功能。
- 仿MIUI音量变化环形进度条实现
- Android系统音量变化后会干什么?
- android 实现音量调节
- flashsim源码阅读7-8(3)
- mybatis sql返回结果为空值
- 是时候要写写点东西
- java求杨辉三角(帕斯卡三角形)
- 深度学习与计算机视觉系列(7)_神经网络数据预处理,正则化与损失函数
- Android——实现微信语音音量变化说话
- 大端(Big Endian)与小端(Little Endian)详解
- 洛谷Oj-瑞士轮-归并排序+快速排序
- 从控制台获取多行不等长数据到一个二维数组
- css BFC 原理
- 线程死锁问题
- 差分约束的做法
- Servlet学习日记(二)——405错误解决及各种http状态码总结
- Leetcode#476. Number Complement(求补码)