仿QQ聊天(5)—聊天表情的适配
来源:互联网 发布:ios图片模糊软件 编辑:程序博客网 时间:2024/06/05 04:22
实现发送表情
第一步:先在drawable下导入需要的一些表情。然后自己再写一个txt文件,放在assets目录下。
txt文件格式如下:
f000.gif就是你放在drawable下表情图片的名称,必须和文字一一对应。
第二步
写两个方法,处理这些数据;
//从Assets中读取文件 public static List<String> readFromAssets(Context context){ List<String> data = new ArrayList<String>(); try { InputStream inputStream = context.getResources().getAssets().open("emoji.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF_8")); String str = null; while((str = br.readLine())!= null){ data.add(str); } return data; } catch (IOException e) { e.printStackTrace(); } return null; }
/** 保存于内存中的表情HashMap */ private static HashMap<String, String> emojiMap = new HashMap<String, String>();//将这些数据处理成实体类 public static List<EmojiEntity> getlistEmEntities(List<String> data,Context context){ List<EmojiEntity> listEmEntities = new ArrayList<EmojiEntity>(); if (data == null) { return null; } EmojiEntity emEntity; for(String str:data){ String[] split = str.split(","); String name1 = split[0]; String name = name1.substring(0,4); String content = split[1]; FileUtils.emojiMap.put(content,name); int id = context.getResources().getIdentifier(name"drawable",context.getPackageName()); if(id != 0){ emEntity = new EmojiEntity(); emEntity.setContent(content); emEntity.setID(id); listEmEntities.add(emEntity); } } return listEmEntities; }
在ChatActivity中调用这两个方法:
private List<EmojiEntity> listEmEntities;List<String> data = FileUtils.readFromAssets(getApplicationContext()); listEmEntities = FileUtils.getlistEmEntities(data, this); int size = listEmEntities.size(); List<EmojiEntity> temListEmEntities1 = listEmEntities.subList(0, 21); List<EmojiEntity> temListEmEntities2 = listEmEntities.subList(22, 43); List<EmojiEntity> temListEmEntities3 = listEmEntities.subList(44, size);
我比较蠢,只会这样写。表情页每页放21个表情,就把数据处理成了三段,没段21个表情。
第三步
点击头像按钮,弹出表情页,表情页是用ViewPager做的,可以左右滑动。观察QQ表情的摆放,可以知道这些表情是发在一个GridView里面的,所以呢,ViewPager的每一页都是一个GridView。在ChatActivity中动态的生成三个GridView,
private List<GridView> listViews = new ArrayList<GridView>();//保存GridView的集合for (int i = 0; i < 3; i++) { GridView view = new GridView(this); view.setOnItemClickListener(this); view.setNumColumns(7); view.setBackgroundColor(Color.TRANSPARENT); view.setHorizontalSpacing(1); view.setVerticalSpacing(1); view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); view.setCacheColorHint(0); view.setPadding(5, 0, 5, 0); view.setSelector(new ColorDrawable(Color.TRANSPARENT)); view.setLayoutParams(new LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); view.setGravity(Gravity.CENTER); if (i == 0) { //设置第一页的表情 GridViewAdapter gvAdapter = new GridViewAdapter(this, temListEmEntities1); view.setAdapter(gvAdapter); listViews.add(view); } else if (i == 1) { //设置第二页的表情 GridViewAdapter gvAdapter = new GridViewAdapter(this, temListEmEntities2); view.setAdapter(gvAdapter); listViews.add(view); } else if (i == 2) { //设置第三页的表情 GridViewAdapter gvAdapter = new GridViewAdapter(this, temListEmEntities3); view.setAdapter(gvAdapter); listViews.add(view); } //这个是ViewPager的适配器。他的里面填充的就是GridView EmojiAdapter amAdapter = new EmojiAdapter(this, listViews); vp_emoji.setAdapter(amAdapter); }
GridView的适配器比较简单,根据数据源temListEmEntities1 ,temListEmEntities2,temListEmEntities3的不同,设置不同的数据,然后根据position给每个位置放上表情
package com.example.adapter;import java.util.ArrayList;import java.util.List;import com.example.activity.ChatActivity;import com.example.bean.EmojiEntity;import com.example.testqqchatui.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;/** * @author 作者:xsl * @version 创建时间 :2015/10/30 * 类说明:表情适配器 */public class GridViewAdapter extends BaseAdapter{ private Context context; private List<EmojiEntity> listEmEntities = new ArrayList<EmojiEntity>(); private LayoutInflater inflater; public GridViewAdapter(ChatActivity chatActivity, List<EmojiEntity> temListEmEntities1) { this.context = chatActivity; this.listEmEntities = temListEmEntities1; inflater = LayoutInflater.from(context); } @Override public int getCount() { return listEmEntities.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { EmojiEntity i = listEmEntities.get(position); View view = null; ViewHolder holder = null; if(convertView == null){ holder = new ViewHolder(); view = inflater.inflate(R.layout.item_face,null); holder.item_iv_face = (ImageView)view.findViewById(R.id.item_iv_face); view.setTag(holder); }else{ view = convertView; holder = (ViewHolder)view.getTag(); } holder.item_iv_face.setImageResource(i.getID()); return view; } class ViewHolder{ ImageView item_iv_face; }}
ViewPager的表情就更简单了,
package com.example.adapter;import java.util.List;import com.example.activity.ChatActivity;import android.content.Context;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.View;import android.widget.GridView;/** * @author 作者:xsl * @version 创建时间 :2015/10/30 * 类说明:表情页面切换适配器 */public class EmojiAdapter extends PagerAdapter{ private Context context; private List<GridView> listViews; public EmojiAdapter(ChatActivity chatActivity, List<GridView> listViews) { this.context = chatActivity; this.listViews = listViews; } @Override public int getCount() { return 3; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1 ; } @Override public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(listViews.get(position)); return listViews.get(position); } @Override public void destroyItem(View container, int position, Object object) { ((ViewPager)container).removeView(listViews.get(position)); }}
这样就把数据适配上去了。
然后点击每一个item就可以把表情发送到聊天窗口了,当然,还需要做一下正则表达式的比较。我是不会的正则的骂我是抄的。源码中有。
0 0
- 仿QQ聊天(5)—聊天表情的适配
- 仿QQ聊天(3)—好友列表的实现
- 仿QQ聊天(4)—简单的聊天页面实现
- android qq聊天动态表情的实现
- android仿qq聊天界面版带表情、相册、照相
- Android 仿QQ和微信发送表情 聊天框架
- WPF仿QQ聊天框表情文字混排实现
- Qt仿QQ界面,主界面、聊天界面、表情界面
- 仿QQ聊天界面里边的相册(QQ相册)
- 仿qq聊天程序设计
- 仿QQ聊天程序
- 仿qq聊天界面
- 仿QQ聊天程序
- flex聊天 发送QQ表情
- 类似qq聊天表情实现
- 类似qq聊天表情实现
- EditText显示QQ聊天表情
- QQ聊天 代码 输入表情
- POJ-2533Longest Ordered Subsequence(LIS)
- JAVA编程思想之内部类
- PARALLEL hint
- 3des加密代码
- mysql两种表存储结构myisam和innodb的性能比较测试
- 仿QQ聊天(5)—聊天表情的适配
- Android Studio 混淆打包 IOException: Please correct the above warnings first
- 黑马程序员——JAVA基础----JAVA概述
- Derby数据库使用手册(1)-----------DDL
- UML之用例篇
- CSS框模型(Box Model)与图片透明属性
- Mac版Github客户端的配置和使用
- 位移枚举
- HttpClient4.2 Fluent API学习