仿QQ聊天(5)—聊天表情的适配

 2023-09-09 阅读 21 评论 0

摘要:实现发送表情 第一步:先在drawable下导入需要的一些表情。然后自己再写一个txt文件,放在assets目录下。 txt文件格式如下: f000.gif就是你放在drawable下表情图片的名称,必须和文字一一对应。 第二步 写两个方法,处理这些数据; //从

实现发送表情

第一步:先在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);

QQ自定义表情包、我比较蠢,只会这样写。表情页每页放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的适配器。他的里面填充的就是GridViewEmojiAdapter 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);}@Overridepublic int getCount() {return listEmEntities.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}@Overridepublic int getCount() {return 3;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1 ;}@Overridepublic Object instantiateItem(View container, int position) {((ViewPager)container).addView(listViews.get(position));return listViews.get(position);}@Overridepublic void destroyItem(View container, int position, Object object) {((ViewPager)container).removeView(listViews.get(position));}}

仿QQ截图,这样就把数据适配上去了。
然后点击每一个item就可以把表情发送到聊天窗口了,当然,还需要做一下正则表达式的比较。我是不会的正则的骂我是抄的。源码中有。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/32836.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息