基本功能

1. 自定义标题栏。(标题栏不做任何功能)

2. 有左右发送按钮。(这个只能自己和自己聊天哦,所以有左右发送按钮)

  (1)点击左边按钮发送按钮,在ListView的左侧显示。
  (2)点击右边按钮发送按钮,在ListView的右侧显示。
  
3.有表情发送按钮。

  (1)当点击表情发送按钮时, 弹出表情框,点击想要发送的表情将其添加输入框中。
  (2)当在此点击表情按钮时,表情框收回。
  (3)当表情框处在显示状态时, 点击输入框时,表情框收回。

聊天界面的制作(一)——基本布局的实现
聊天界面的制作(二)——发送消息后ListView左右布局显示
源码下载链接

表情列表发送功能

1. 在总布局中添加一个GridView控件,用于显示表情列表。控件中设置一个android:visibility="gone"让其不显示且不占用空间。当点击表情按钮时才显示,也就是将其值在设置为”visible”;当在次点击时,不显示表情框,也就是又将其值设置为”gone”。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><include
        android:id="@+id/title_bar"layout="@layout/title_bar"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ListView
        android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/chatting_background"android:listSelector="@android:color/transparent"></ListView><LinearLayout
        android:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/grey"android:gravity="bottom"android:orientation="horizontal"><ImageButton
            android:id="@+id/imagebutton_expression"android:layout_width="40dp"android:layout_height="40dp"android:layout_margin="10dp"android:focusable="true"android:background="@drawable/imagebutton_expression" /><Button
            android:id="@+id/button_left"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_margin="5dp"android:background="@drawable/button_send_background"android:padding="5dp"android:text="发送"android:textColor="@color/white" /><EditText
            android:id="@+id/edittext_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dp"android:layout_weight="1"android:background="@drawable/edittext_background"android:padding="7dp"android:layout_gravity="center"/><Button
            android:id="@+id/button_right"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_margin="5dp"android:background="@drawable/button_send_background"android:padding="5dp"android:text="发送"android:textColor="@color/white" /></LinearLayout><GridView
        android:id="@+id/gridview"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="7"android:visibility="visible"android:background="@color/grey"></GridView></LinearLayout>

2. 首先定义一个布局,用于在GridView中的Item中显示每一个表情。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageView
        android:id="@+id/imageview_expression"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:src="@mipmap/dra" /></LinearLayout>

定义ExpressionAdapter将表情数据添加到布局中。

public class ExpressionAdapter extends BaseAdapter {//表情数据private int[] mExpression = {R.mipmap.dra,R.mipmap.drb,R.mipmap.drc,R.mipmap.drd,R.mipmap.dre,R.mipmap.drf,R.mipmap.drg,R.mipmap.drh,R.mipmap.dri,R.mipmap.drj,R.mipmap.drk,R.mipmap.drl,R.mipmap.drm,R.mipmap.drn,R.mipmap.dro,R.mipmap.drp,R.mipmap.drq,R.mipmap.drr,R.mipmap.drs,R.mipmap.drt,R.mipmap.dru,R.mipmap.drv,R.mipmap.drw,R.mipmap.drx,R.mipmap.dry,R.mipmap.drz,R.mipmap.dra};private LayoutInflater mInflater;public ExpressionAdapter(LayoutInflater mInflater) {this.mInflater = mInflater;}@Overridepublic int getCount() {return mExpression.length;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup viewGroup) {ViewHolder viewHolder = null;if(convertView == null){convertView = mInflater.inflate(R.layout.item_expression, null);viewHolder = new ViewHolder();viewHolder.imageview = (ImageView) convertView.findViewById(R.id.imageview_expression);convertView.setTag(viewHolder);}else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.imageview.setImageResource(mExpression[position]);return convertView;}class ViewHolder{ImageView imageview;}
}

3. 定义一个富文本,富文本中需要创建ImageGetter对象。然后通过Spanned对象ImageGetter对象返回的id来获得图片。

public class MainActivity extends Activity implements View.OnClickListener {private Button mButtonLeft;//左边发送按钮private Button mButtonRight;//右边发送按钮private EditText mEditTextInput;//输入框private ListView mListView;//显示消息的ListViewprivate GridView mGridView;//显示表情的GridViewprivate ImageButton mImageButtonExpression;//弹出和收回表情框的按钮private Spanned mSpanned;//富文本private Html.ImageGetter mImageGetter;//获得富文本图片private List<ChatMessage> mData;//消息数据private MessageAdapter mMessageAdapter;//消息适配器private ExpressionAdapter mExpressionAdapter;//表情适配器private InputMethodManager mInputMethodManager;//用于控制手机键盘的显示有否的对象(此处)//表情数据名称private String[] mExpression = {"dra", "drb", "drc", "drd", "dre", "drf","drg", "drh", "dri", "drg", "drk", "drl","drm", "drn", "dro", "drp", "drq", "drr","drs", "drt", "dru", "drv", "drw", "drx","dry", "drz", "dra"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButtonLeft = (Button) findViewById(R.id.button_left);mButtonRight = (Button) findViewById(R.id.button_right);mEditTextInput = (EditText) findViewById(R.id.edittext_input);mImageButtonExpression = (ImageButton) findViewById(R.id.imagebutton_expression);mListView = (ListView) findViewById(R.id.listview);mGridView = (GridView) findViewById(R.id.gridview);mButtonLeft.setOnClickListener(this);mButtonRight.setOnClickListener(this);mImageButtonExpression.setOnClickListener(this);mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);//消息数据初始化mData = new ArrayList<ChatMessage>();//通过反射获得图片的idmImageGetter = new Html.ImageGetter() {@Overridepublic Drawable getDrawable(String s) {Drawable drawable = null;int id = R.mipmap.dra;if (s != null) {Class clazz = R.mipmap.class;try {Field field = clazz.getDeclaredField(s);id = field.getInt(s);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}drawable = getResources().getDrawable(id);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());return drawable;}};mExpressionAdapter = new ExpressionAdapter(getLayoutInflater());mGridView.setAdapter(mExpressionAdapter);//点击表情,将表情添加到输入框中。mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {//通过mImageGetter获得id获得表情图片,然后将其添加到输入框中。mSpanned = Html.fromHtml("<img src='" + mExpression[position] + "'/>", mImageGetter, null);mEditTextInput.getText().insert(mEditTextInput.getSelectionStart(), mSpanned);}});//点击输入框收回表情框mEditTextInput.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (mGridView.getVisibility() == View.VISIBLE) {mGridView.setVisibility(View.GONE);}}});}@Overridepublic void onClick(View view) {mMessageAdapter = new MessageAdapter(getLayoutInflater(), mData, mImageGetter);switch (view.getId()) {case R.id.imagebutton_expression://添加表情的按钮if (mGridView.getVisibility() == View.VISIBLE) {mGridView.setVisibility(View.GONE);} else {mGridView.setVisibility(View.VISIBLE);mInputMethodManager.hideSoftInputFromWindow(mEditTextInput.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);}break;case R.id.button_left://左边的发送按钮showListViewLeft();break;case R.id.button_right://右边的发送按钮showListViewRight();break;default:break;}}/*发送左边消息*/private void showListViewRight() {ChatMessage dataRight = new ChatMessage();dataRight.setTextViewTime(System.currentTimeMillis());dataRight.setTextViewHonour("营长");dataRight.setTextviewName("虫虫");/*判断发送的消息是否为空,如果为空则弹出提示不允许发送*/if (filterHtml(Html.toHtml(mEditTextInput.getText())).equals("")) {Toast.makeText(getApplicationContext(), "发送的消息不能为空!", Toast.LENGTH_SHORT).show();return;}dataRight.setTextViewInput(filterHtml(Html.toHtml(mEditTextInput.getText())));dataRight.setType(MessageAdapter.SEND_RIGHT);mMessageAdapter.notifyDataSetChanged();mData.add(dataRight);mListView.setAdapter(mMessageAdapter);mListView.setSelection(mData.size() - 1);mEditTextInput.setText("");}/*发送右边消息*/private void showListViewLeft() {ChatMessage dataLeft = new ChatMessage();dataLeft.setTextViewTime(System.currentTimeMillis());dataLeft.setTextViewHonour("营长");dataLeft.setTextviewName("虫虫");/*判断发送的消息是否为空,如果为空则弹出提示不允许发送*/if (filterHtml(Html.toHtml(mEditTextInput.getText())).equals("")) {Toast.makeText(getApplicationContext(), "发送的消息不能为空!", Toast.LENGTH_SHORT).show();return;}//将解析的数据添加到输入框中。dataLeft.setTextViewInput(filterHtml(Html.toHtml(mEditTextInput.getText())));dataLeft.setType(MessageAdapter.SEND_LEFT);mMessageAdapter.notifyDataSetChanged();mData.add(dataLeft);mListView.setAdapter(mMessageAdapter);mListView.setSelection(mData.size() - 1);mEditTextInput.setText("");}public String filterHtml(String str) {str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();return str;}
}

弹出收回表情框功能演示:

发送表情,在文本任意处插入表情功能演示:

聊天界面在点击表情按钮时会收回手机输入法键盘,在模拟器中无法演示,在此说明下。

聊天界面的制作(三)——表情列表发送功能相关推荐

  1. android聊天界面与功能,【android】聊天界面的制作-简易版实现

    看完了第一行代码第三章,改进了一些基本功能,下面就听小弟一一道来: 也参考了很多别人的代码,但是总觉得一些功能可以比较轻松的实现就不绕那么多弯子,就用最基础的码代码实现一样的功能:(1)整体布局代码一 ...

  2. 解决类似微信聊天界面软键盘和表情框冲突问题

    软键盘相关的知识: 针对软键盘,如果想让键盘覆盖我们视图控件.那么在 AndroidManifest.xml中对该Activity加上 android:windowSoftInputMode=&quo ...

  3. DT tableone各种花里胡哨的图 把dataframe导出成html 把矩阵变成html方便查看 类似于shinny功能 制作三线表等共功能 fextable 花里胡哨的工具 datatable

    G:\r\tcga_example-master fextable 花里胡哨的工具 datatable https://rstudio.github.io/DT/ #https://davidgohe ...

  4. 微信小程序原生接入腾讯云im(单聊,列表,聊天界面,自定义消息,自动回复)

    微信小程序原生接入腾讯云im(单聊,列表,聊天界面,自定义消息,自动回复) 发送图片语音消息传送→ 文章目录 1.项目需求 2.参考文档 3.效果图 4.初始化 集成SDK 5.登录 6.会话列表 7 ...

  5. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  6. flutter聊天界面-自定义表情键盘实现

    flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iO ...

  7. 编写精美的聊天界面(左边显示接收消息,右边显示发送消息)(项目已上传GitHub)

    附上我的GitHub项目地址: https://github.com/Skymqq/UIChat.git 学习Android开发,了解一个精美聊天界面的实现是很有必要的,如果可以掌握这个技能,那么在下 ...

  8. flutter 聊天界面+表情图片

    网上找了找 零零碎碎有一些文章 没找到一个整体的 自己做完记录一下 防止忘了 大体就是这样 聊天气泡用的是 https://blog.csdn.net/oterminator12/article/de ...

  9. 表情包受保护无法发送怎么破解和制作gif表情包

    找到表情包的文件,把文件后缀修改为gif,用photoshop打开它,导出gif格式的文件. 微信的表情包,我写了这篇文章几天就对表情包原文件进行加密了.不过若大家有表情包原文件,虽然不能直接使用可以 ...

最新文章

  1. 转 awk 使用方法
  2. python使用gevent实现协程
  3. 地铁时间:第 1 周
  4. Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2
  5. 系统分析师和系统架构设计师难度比较_系统架构设计师,马上开课了!
  6. Windows10-1909各个版本进行下载地址汇总
  7. android 半圆滚动菜单,自定义控件:实现半圆滚动菜单效果
  8. LATEX数学式哪种字号比较漂亮
  9. 百度否认退市;微信官方回应「个人影响度报告」;微软公布 C# 9.0 计划 | 极客头条...
  10. struts入门实例
  11. [教程]VC++6.0的简单使用
  12. 网易云音乐api,网络太拥挤,登录失败
  13. 想要穷游北京?这些湖光山色的地方人少还景美!
  14. 洞悉物联网发展1000问之为什么虚拟现实技术将迎来春天?
  15. MP4文件格式简要解析---代码解析
  16. PS填充、仿制图章和修补工具
  17. 并发编程之深入理解十三:CompletionService CompletableFuture
  18. Python向左,数学向右:梅森素数
  19. zeromq初体验C语言版本测试程序及C++测试程序
  20. vscode ssh 远程连接总是循环验证密码

热门文章

  1. 禁用uwebiview 的反弹功能 bounces
  2. Python 二次指数平滑法 预测
  3. Office快捷键汇总(仅供学习交流)
  4. 年薪30W+的IC验证工程师究竟是做什么的?一文为你讲解清楚
  5. 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)...
  6. Mybatis的模糊查询写法
  7. Mac OS X系统下修改wifi共享的默认网段
  8. 内网安全-常见横向移动总结
  9. 机电团队怎么使用软件系统快速实施 部署
  10. PDF办公技巧之PDF怎么删除其中一页