仿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