android 语音聊天播放动画的问题
欢迎大家进群:574605026 开启我们的开发之旅
可能现在还有人不知道我这个标题写的到底是什么问题
大家先看图,我再给大家解释
看图说话大家是不是就明白多了,这篇博客呢,不是给大家讲解实现即时通讯聊天功能的,
主要是给大家说下这里面语音播放动画的问题,会遇到什么问题呢,可能会遇到,在你播放第一个语音的时候,
第一个语音还没有播放完,你就点击第二个进行播放,这时候就出现了第一个语音的动画一直在播放状态。
这样会让客户的体验很不好,此博客在致力于解决这个问题。
直接看代码吧
首先是语音点击事件:
就是这么一句话,如果不知道各个参数是什么意思的话,就看下面对click的封装吧
ll_voice.setOnClickListener(new VoicePlayClickListener(msg,iv_voice1,this, (Activity) mContext,filePath));
VoicePlayClickListener.class
import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.view.View; import android.widget.BaseAdapter; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.sharetime.mobileoffice.R; import com.sharetime.mobileoffice.crm.utils.UrlUtil; import com.sharetime.mobileoffice.entity.LsMessageObj; import com.sharetime.mobileoffice.ui.ChatActivity; import java.io.File; /***************************************************** * author: wz * email: wangzhong0116@foxmail.com * version: 1.0 * date: 2016/12/13 15:03 * description: 播放语音监听事件 * 主要解决在播放的时候,点击下一个语音, * 导致没有播放完成的语音动画停止不了的 * 原因。 *****************************************************/ public class VoicePlayClickListener implements View.OnClickListener { ImageView voiceIconView; MediaPlayer mediaPlayer = null; Activity activity; private BaseAdapter adapter; private String voicePath=""; private LsMessageObj message; public static boolean isPlaying = false; public static VoicePlayClickListener currentPlayListener = null; /** * 首先我简单解释下这几个产出的含义 * @param message 消息实体类 * @param voiceIconView 语音播放ImageView * @param adapter 聊天列表适配器 * @param activity 聊天Activity * @param voicePath 语音路径 */ public VoicePlayClickListener(LsMessageObj message, ImageView voiceIconView, BaseAdapter adapter, Activity activity, String voicePath) { this.message=message; this.adapter = adapter; this.voiceIconView = voiceIconView; this.activity = activity; this.voicePath=voicePath; } public void stopPlayVoice() { if (!message.getCreate_user_id().equals(UrlUtil.getUserId())) { voiceIconView.setImageResource(R.mipmap.button_voice); } else { voiceIconView.setImageResource(R.mipmap.button_voice1); } if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); } isPlaying = false; ((ChatActivity) activity).playMsgId = null; adapter.notifyDataSetChanged(); } public void playVoice(String filePath) { if (!(new File(filePath).exists())) { return; } ((ChatActivity) activity).playMsgId = message.getId()+""; AudioManager audioManager = (AudioManager) activity .getSystemService(Context.AUDIO_SERVICE); mediaPlayer = new MediaPlayer(); audioManager.setMode(AudioManager.MODE_NORMAL); audioManager.setSpeakerphoneOn(true); mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING); try { mediaPlayer.setDataSource(filePath); mediaPlayer.prepare(); mediaPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.release(); mediaPlayer = null; stopPlayVoice(); // stop animation } }); isPlaying = true; currentPlayListener = this; mediaPlayer.start(); showAnimation(); } catch (Exception e) { } } /** * 展示播放动画 * 此处使用的是glide播放的gif动画,投机取巧下 * 不过大家也可以使用anim来播放动画 */ private void showAnimation() { if (!message.getCreate_user_id().equals(UrlUtil.getUserId())) { Glide.with(activity).load(R.drawable.voice1).into(voiceIconView); } else { Glide.with(activity).load(R.drawable.voice2).into(voiceIconView); } } @Override public void onClick(View v) { if (isPlaying) { if (((ChatActivity) activity).playMsgId != null && ((ChatActivity) activity).playMsgId.equals(message .getId()+"")) { currentPlayListener.stopPlayVoice(); return; } currentPlayListener.stopPlayVoice(); } playVoice(voicePath); } }简单就是这样,代码注释都写了,大家应该都能够看懂。
如果细心的朋友,应该会看到我最近写的博客都是关于聊天方面的,
最近在做聊天功能,没有使用任何第三方,使用websocket,大家也可以去研究研究
本来呢,打算做个聊天的demo,给大家总结下,供大家参考,最近时间实在是太紧了,
等以后有时间了,一定做个完整的demo出来,希望大家多多给与支持,今天就说到这里,
大家如果有谁在做聊天功能,如果有什么问题呢,可以相互探讨。