仿微信聊天功能实现
来源:互联网 发布:禁毒网络知识竞赛答案 编辑:程序博客网 时间:2024/05/01 17:08
首先:微信聊天功能模块包括
1,发送文字
2,发送表情
3,发送语音
4,发送图片(图库和相机,可以同时发送多张)
其中,文字和表情是可以一起发送的,可以同时存在同一个输入框当中,语音和图片是独立各自发送。
实现:文字和表情同时存在一个Edittext当中,可以同时发送。
使用自定义输入View控件。
实现之后的截图是酱的。
所以东西比较多,我们把他们统一放到我们的自定义控件当中,切换通过Visibility来控制,然后表情,主要是通过ViewPager实现,ViePager里面使用的是一个GridView,GridView里面再去显示一个表情。然后得出我们的关键类:
FaceRelativeLayout,主要去初始化表情,管理表情。
表情转换Util:FaceConversionUtil,用于转换表情,读取表情,解释表情。主要使用到正则表达式去解释,然后SpannableString和ImageSpan去实现String转换为图片。
录音实现:使用一个自定义的Button,处理他自己的点击事件,通过回调回传数据给Activity,使用一个manager管理录音,比如开始,暂停,完成,取消等,使用一个Dialog实现录音情况显示,比如音量大小等。所以需要三个类
AudioRecoderButton 自定义button,处理自己的onTouch事件,从而处理录音情况,比如超出范围取消,范围内发送等
AudoManager 处理,音频文件保存,开始,释放
DialogManager 处理录音时候提示Dialog的显示,消失
播放,在用户点击播放声音的时候播放,是在ListView的item的对应的ImageView当中播放。使用一个manager管理
MediaManager 包括播放,错误处理,成功回调,暂停,释放
发送图片实现:首先是自定义一个图库,显示系统的所有照片,就是 ShowAllLocalPicActivity,然后需要显示某一个文件夹下面的全部照片ShowLocalDetailPicActivity,然后是点击单张照片的时候显示图片详情ShowOnePicActivity,可以切换。
所以有三个类
ShowAllLocalPicActivity 需要适配器,使用ListView,功能是显示所有照片,然后返回被选中的照片到MainActivity,然后发送。
ShowLocalDetailPicActivity需要适配器,使用GridView 可以选择或者取消被选中的照片
ShowOnePicActivity 需要适配器,使用ViewPager实现 可以选择或者取消被选中的照片
然后到我们的MainActivity,他也是需要适配器,使用ListView显示聊天内容、
聊天内容划分:
首先是否是自己发送的,然后是哪一类,包括文字表情,语音,图片,三类。
难点在View的重用上面
,我们需要在适配器的getView方法中,进行判断,逻辑是:
先是是否自己发送的,然后是这个converView是否为null和不为null,他是属于谁的,加入converview为null或者converview不属于对应的人,那么,我们就需要重写生成converview。否则,重用就好。
然后,通过判断他的type,看他属于哪一类的消息,就使用哪一类的控件显示。
还有,输入法的问题
强制隐藏或者是显示输入法:
public class InputMethodUtil {
//其中et_sendmessage是需要输入的view,下面同是
public static void hideInput(Context context, EditText et_sendmessage) {
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(et_sendmessage.getWindowToken(), 0); //制隐藏键盘
}
public static void showInput(Context context, EditText et_sendmessage) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et_sendmessage, InputMethodManager.SHOW_FORCED);
}
public static void showInput(Context context, EditText et_sendmessage) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et_sendmessage, InputMethodManager.SHOW_FORCED);
}
}
监听输入法的打开或者是隐藏事件,使用你需要监听的Activity的根view,设置对应事件:
//键盘事件监听
final int heigh = getWindowManager().getDefaultDisplay().getHeight() /3;
root.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
final int heigh = getWindowManager().getDefaultDisplay().getHeight() /3;
root.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//弹起事件
if (bottom != 0 && oldBottom != 0 && oldBottom- bottom >heigh) {
if (mListView.getLastVisiblePosition() != mDateArrays.size() - 1) {
mListView.smoothScrollToPosition(mDateArrays.size() -1);
mListView.smoothScrollToPosition(mDateArrays.size() -1);
}
}
else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){
Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show(); }
}
});
需要在对应的Activity当中,设置
android :windowSoftInputMode= "stateAlwaysHidden|adjustResize"
即可监听。
详细代码实现看github:https://github.com/liweijieok/mychat
欢迎大家一起学习,可以的话请给小星星~~
注:本demo的原型是一位名为廖乃波的人写的,本人是将其改进有优化,他写的部分包括表情显示和自定义表情的View以及部分适配器和bean
最后,个人微信公众号,thank you! 0 0
- 仿微信聊天功能实现
- Android 仿微信实现语音聊天功能
- Dwr2实现聊天功能
- MINA 实现聊天功能
- Netty 实现聊天功能
- Netty 实现聊天功能
- Netty 实现聊天功能
- Netty 实现聊天功能
- Socket实现聊天功能
- Socket 实现聊天功能
- Netty 实现聊天功能
- Netty 实现聊天功能
- 使用 Ajax 实现聊天功能
- UDP 聊天功能的实现
- XMPP实现简单聊天功能
- Silverlight+WCF实现聊天功能
- NUGI聊天功能的实现
- unity3d中实现聊天功能
- WebService “测试窗体只能用于来自本地计算机的请求”解决方法
- Linux_shell_ 进阶
- Spring概述<00>
- (5)在DLL中使用DuiLib
- 设置Eclipse中的tab键为4个空格的完整方法
- 仿微信聊天功能实现
- LibGDX_5.1: 位图文字工具(Hiero 工具 与 BitmapFont 类)
- Java Web 开发入门,大神级解读
- 一个比较好的博客
- Redis服务器配置2.8
- Java-----Java进制转换
- 天猫魔盒防删除解决办法
- matlab 修改GUI左上角Logo
- Android毛玻璃效果