前段时间做了个即时聊天的项目,聊天表情那块是由我来做的,之前没有写过类似的东西,然后自己研究了一下,发现比较容易

表情都是一张张的图片资源,这些图片预先放在drawable文件夹下(类似于QQ的个性表情下载另当别论,其实无非也就是下载了一批图片,然后加到界面中显示而已)。

1.这里先把图片资源封装成一个类,这个类用于存放图片的名称以及资源位置信息

public class EmotionInfo {
private String imgName;
private int sourceId;
public String getImgName() {
      return imgName;
      }
public void setImgName(String imgName) {

this.imgName = imgName;
      }
public int getSourceId() {
      return sourceId;
      }
public void setSourceId(int sourceId) {
      this.sourceId = sourceId;
      }

public static EmotionInfo codeFromId(String imgName,int sourceId){
EmotionInfo emo=new EmotionInfo();
emo.setImgName(imgName);
emo.setSourceId(sourceId);
return emo;
}

}

2.然后将每一张图片生成一个图片信息对象,放在数组中:

public class EmotionImages {
public static EmotionInfo[] emotion=new EmotionInfo[]{
EmotionInfo.codeFromId("emoji_1f600", R.drawable.emoji_1f600),
EmotionInfo.codeFromId("emoji_1f601", R.drawable.emoji_1f601),
EmotionInfo.codeFromId("emoji_1f602", R.drawable.emoji_1f602),
EmotionInfo.codeFromId("emoji_1f603", R.drawable.emoji_1f603),
EmotionInfo.codeFromId("emoji_1f604", R.drawable.emoji_1f604),
EmotionInfo.codeFromId("emoji_1f605", R.drawable.emoji_1f605),
EmotionInfo.codeFromId("emoji_1f606", R.drawable.emoji_1f606),
EmotionInfo.codeFromId("emoji_1f607", R.drawable.emoji_1f607),
EmotionInfo.codeFromId("emoji_1f608", R.drawable.emoji_1f608),
EmotionInfo.codeFromId("emoji_1f609", R.drawable.emoji_1f609),
EmotionInfo.codeFromId("emoji_1f60a", R.drawable.emoji_1f600),
EmotionInfo.codeFromId("emoji_1f60b", R.drawable.emoji_1f60b),
EmotionInfo.codeFromId("emoji_1f60c", R.drawable.emoji_1f60c),
EmotionInfo.codeFromId("emoji_1f60d", R.drawable.emoji_1f60d),
EmotionInfo.codeFromId("emoji_1f60e", R.drawable.emoji_1f60e),
EmotionInfo.codeFromId("emoji_1f60f", R.drawable.emoji_1f60f),

EmotionInfo.codeFromId("emoji_1f610", R.drawable.emoji_1f610),
EmotionInfo.codeFromId("emoji_1f611", R.drawable.emoji_1f611),
EmotionInfo.codeFromId("emoji_1f612", R.drawable.emoji_1f612),
EmotionInfo.codeFromId("emoji_1f613", R.drawable.emoji_1f613),
EmotionInfo.codeFromId("emoji_1f614", R.drawable.emoji_1f614),
EmotionInfo.codeFromId("emoji_1f615", R.drawable.emoji_1f615),
EmotionInfo.codeFromId("emoji_1f616", R.drawable.emoji_1f616),
EmotionInfo.codeFromId("emoji_1f617", R.drawable.emoji_1f617),
EmotionInfo.codeFromId("emoji_1f618", R.drawable.emoji_1f618),
EmotionInfo.codeFromId("emoji_1f619", R.drawable.emoji_1f619),
EmotionInfo.codeFromId("emoji_1f61a", R.drawable.emoji_1f61a),
EmotionInfo.codeFromId("emoji_1f61b", R.drawable.emoji_1f61b),
EmotionInfo.codeFromId("emoji_1f61c", R.drawable.emoji_1f61c),
EmotionInfo.codeFromId("emoji_1f61d", R.drawable.emoji_1f61d),
EmotionInfo.codeFromId("emoji_1f61e", R.drawable.emoji_1f61e),
EmotionInfo.codeFromId("emoji_1f61f", R.drawable.emoji_1f61f),

EmotionInfo.codeFromId("emoji_1f620", R.drawable.emoji_1f620),
EmotionInfo.codeFromId("emoji_1f621", R.drawable.emoji_1f621),
EmotionInfo.codeFromId("emoji_1f622", R.drawable.emoji_1f622),
EmotionInfo.codeFromId("emoji_1f623", R.drawable.emoji_1f623),
EmotionInfo.codeFromId("emoji_1f624", R.drawable.emoji_1f624),
EmotionInfo.codeFromId("emoji_1f625", R.drawable.emoji_1f625),
EmotionInfo.codeFromId("emoji_1f626", R.drawable.emoji_1f626),
EmotionInfo.codeFromId("emoji_1f627", R.drawable.emoji_1f627),
EmotionInfo.codeFromId("emoji_1f628", R.drawable.emoji_1f628),
EmotionInfo.codeFromId("emoji_1f629", R.drawable.emoji_1f629),
EmotionInfo.codeFromId("emoji_1f62a", R.drawable.emoji_1f62a),
EmotionInfo.codeFromId("emoji_1f62b", R.drawable.emoji_1f62b),
EmotionInfo.codeFromId("emoji_1f62c", R.drawable.emoji_1f62c),
EmotionInfo.codeFromId("emoji_1f62d", R.drawable.emoji_1f62d),
EmotionInfo.codeFromId("emoji_1f62e", R.drawable.emoji_1f62e),
EmotionInfo.codeFromId("emoji_1f62f", R.drawable.emoji_1f62f),

EmotionInfo.codeFromId("emoji_1f630", R.drawable.emoji_1f630),
EmotionInfo.codeFromId("emoji_1f631", R.drawable.emoji_1f631),
EmotionInfo.codeFromId("emoji_1f632", R.drawable.emoji_1f632),
EmotionInfo.codeFromId("emoji_1f633", R.drawable.emoji_1f633),
EmotionInfo.codeFromId("emoji_1f634", R.drawable.emoji_1f634),
EmotionInfo.codeFromId("emoji_1f635", R.drawable.emoji_1f635),
EmotionInfo.codeFromId("emoji_1f636", R.drawable.emoji_1f636),
EmotionInfo.codeFromId("emoji_1f637", R.drawable.emoji_1f637),

};

3.后面的操作其实很简单,定义一个带有小圆点的自定义viewPager,然后将图片分为三等份填入到三个Gridview中,再将三个gridView分别作为ViewPager的三个条目填充到ViewPager里面,自定义控件代码如下:

public class EmotionViewPager extends RelativeLayout {
private Context context;
private ArrayList<EmotionPager> list;
private ViewPager viewpager;
private LinearLayout llpoint;

private OnPagerEmotionItemClickListener listener;

public EmotionViewPager(Context context) {
super(context);

initView(context);
}

public EmotionViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}

public EmotionViewPager(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}

private void initView(Context context) {
this.context = context;
View view = LayoutInflater.from(context).inflate(R.layout.layout_emotion_viewpager, this);
viewpager = (ViewPager) view.findViewById(R.id.emo_view_pager);
llpoint = (LinearLayout) view.findViewById(R.id.emo_ll_point);
}

public void setData(ArrayList<EmotionPager> list) {
this.list = list;
EmotionAdapter emoAdapter = new EmotionAdapter();
viewpager.setAdapter(emoAdapter);
setPoint();
viewpager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {

for (int i = 0; i < llpoint.getChildCount(); i++) {
ImageView image = (ImageView) llpoint.getChildAt(i);
if (i == position) {
image.setImageResource(R.drawable.emotion_pager_point_black);
} else {
image.setImageResource(R.drawable.emotion_pager_point_white);
}

}
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageScrollStateChanged(int arg0) {

}
});
}

/**
* 设置小圆点
*/
public void setPoint() {
ImageView ivPoint;
for (int i = 0; i < list.size(); i++) {

ivPoint = new ImageView(context);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(50, 10, 50, 10);
ivPoint.setLayoutParams(params);
if (i == 0) {
ivPoint.setImageResource(R.drawable.emotion_pager_point_black);
} else {
ivPoint.setImageResource(R.drawable.emotion_pager_point_white);
}
llpoint.addView(ivPoint);
}
}

private class EmotionAdapter extends PagerAdapter {

@Override
public Object instantiateItem(ViewGroup container, int position) {
EmotionPager pager = list.get(position);
container.addView(pager.getEmotionPagerView());
LogUtils.e("EmotionAdapter", "EmotionAdapter" + position);
pager.setOnEmotionItemClickListener(new OnEmotionItemClickListener() {

@Override
public void onEmotionItemClick(String EmotionImgName) {
listener.onPagerEmotionItemClick(EmotionImgName);
}
});
return pager.getEmotionPagerView();
}

@Override
public int getCount() {
return list.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView(list.get(position).getEmotionPagerView());
}

};

public void setOnPagerEmotionItemClickListener(OnPagerEmotionItemClickListener listener) {
this.listener = listener;
}

public interface OnPagerEmotionItemClickListener {
public void onPagerEmotionItemClick(String EmotionImgName);
}
}

,定义一个pager类,将图片分为三等份生成三个pager对象,pager类如下:

public class EmotionPager {
public static int FRIST_PAGER = 1;
public static int SECOND_PAGER = 2;
public static int THIRD_PAGER = 3;

private Context context;
private View view;
private int whichPager;

private EmotionInfo[] emoImages = EmotionImages.emotion;
private ArrayList<EmotionInfo> fristPagerData = new ArrayList<EmotionInfo>();
private GridView emotion_pager_gv;

private OnEmotionItemClickListener listener;
private EmoPagerAdapter emoAdapter;

public EmotionPager(Context context, int whichPager) {
this.context = context;
this.whichPager = whichPager;
int start, end;
if (whichPager == FRIST_PAGER) {
start = 0;
end = 20;
} else if (whichPager == SECOND_PAGER) {
start = 21;
end = 41;
} else {
start = 42;
end = 55;
}
for (int i = start; i <= end; i++) {
fristPagerData.add(emoImages[i]);
}
}

public View getEmotionPagerView() {
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.layout_emotion_pager, null);
emotion_pager_gv = (GridView) view.findViewById(R.id.emotion_pager_gv);
emoAdapter = new EmoPagerAdapter();
emotion_pager_gv.setAdapter(emoAdapter);
}
emotion_pager_gv.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
EmotionInfo emotionInfo = (EmotionInfo) emoAdapter.getItem(position);
listener.onEmotionItemClick(emotionInfo.getImgName());
}
});
return view;
}

public void setOnEmotionItemClickListener(OnEmotionItemClickListener listener) {
this.listener = listener;
}

private class EmoPagerAdapter extends BaseAdapter {

@Override
public int getCount() {
return fristPagerData.size();

}

@Override
public Object getItem(int position) {
return fristPagerData.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_emotion_pager, parent, false);
holder.ivEmotion = (ImageView) convertView.findViewById(R.id.item_emotion_pager_item_iv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.ivEmotion.setImageResource(fristPagerData.get(position).getSourceId());
return convertView;
}

}

public class ViewHolder {
public ImageView ivEmotion;
}

public interface OnEmotionItemClickListener {
public void onEmotionItemClick(String EmotionImgName);
}

接下来的事情大家都知道了,无非就是定义一个PagerAdapter,将pager填充进去就好了!

即时聊天表情功能的实现相关推荐

  1. java swing 聊天表情功能的实现(带完整代码)

    下载地址:https://gitee.com/zoyation/pic-chat 前言: 用java swing做聊天程序,可能是没事找事,也可能是大才小用,既然选择了就做吧 其中比较重要的功能可能就 ...

  2. 关于Vue开发即时聊天类功能的经验分享(其实并不复杂)

    当下即时通讯已经成为大多数产品的主要功能,最近在工作过程中需要初步开发一个具有基础通讯功能的客服功能.根据此开发功能的过程,总结了一些开发经验与方法(使用的SDK不同,实现方法也会有比较大的差异).之 ...

  3. 直播APP制作时即时聊天功能实现

    目前直播app制作很火,直播中的即时聊天功能必不可少.云豹直播作为优质的直播平台源码提供商,在即时聊天功能方面必有其独到之处,下面为大家从如何实现即时聊天这个功能上答疑解惑. 即时聊天这个需求在很多a ...

  4. java xmpp 框架_即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

  5. 基于Nodejs开发的web即时聊天工具

    由于公司需要开发web即时聊天的功能,开始时我们主要的实施方法是用jquery的ajax定时(10秒)轮询向服务器请求,由于是轮询请求,对 服务器的压力比较大.我们网站上线的时间不长,访问量不是很大, ...

  6. Android 深入实现基于socket套接字的即时聊天

    实现功能 1.历史消息存储 2.未读消息存储 题记 程序猿小白第一次写博客,有不足和改进的地方希望大家多多指教!有关用socket实现即时聊天简易功能的文章csdn上一抓一大把,博主最近在做的一款ap ...

  7. 安卓集成腾讯即时通信IM完成聊天室功能

    安卓集成腾讯即时通信IM完成聊天室功能 没有效果图的文章都是扯淡 **请将下面的MainActivity的代码复制到源码里面,替换掉源码的MainActivity.class** 话不多说,下来上代码 ...

  8. php和ajax实现聊天功能,怎么在PHP项目中使用jquery与ajax实现一个即时聊天功能

    怎么在PHP项目中使用jquery与ajax实现一个即时聊天功能 发布时间:2020-12-19 16:19:01 来源:亿速云 阅读:81 作者:Leah 本篇文章给大家分享的是有关怎么在PHP项目 ...

  9. 网易im即时聊天php怎么接入,网易云信IM即时通讯功能接入方式与流程_如何收费_企业服务汇...

    编者按:很多企业在考虑使用网易云信提供的IM即时通讯功能,对于企业应当如何接入该功能.接入方式和流程是怎样的.应当如何收费等不太清楚.企业服务汇通过评测网易云信IM即时通讯功能来告诉你答案. 网易云信 ...

最新文章

  1. 【Math Time 】Mean, Median, Mode 之间的区别
  2. CMake编译Widget UI Qt程序
  3. Python也有做大型游戏的潜力?原来我们小看了Python,无所不能!!
  4. SAP Cloud for Customer前台发送到后台的HTTP请求,遇到错误该怎么分析
  5. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)...
  6. vue项目的docker部署
  7. 网易buff服务器不稳定,《梦幻西游》手游平民94方寸逆袭成神分享心得助你腾飞_ 《梦幻西游》手游官网-人人都玩,无处不在...
  8. GPS基带P码处理总结——P码处理的要素及方法
  9. 信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)
  10. m8+android固件,M8完美Android 2.2 LBE A11版固件发布
  11. MAC 隐藏程序坞中JDK图标
  12. 谷歌联合印企狙击华为鸿蒙OS:推出轻量版安卓系统打造智能手机
  13. 远古视频点播系统的一个注入漏洞
  14. NYOJ91 阶乘之和 与全加器设计Verilog HDL
  15. js加密怎样不让别人看到
  16. 用QQ邮箱注册到MSN live 账号
  17. 背调公司要我提供个税APP的录屏和截图,这违法吗?
  18. 罗兰贝格第十期《汽车行业颠覆性数据探测》重磅发布:虽近犹远——通往自动驾驶的曲折之路...
  19. eclipse中SVN连不上报错org.tigris.subversion.javahl.ClientException
  20. 100g光模块厂家排名_100G光模块主流标准都有哪些

热门文章

  1. SD-WAN — MPLS 广域网 VPN 技术解析
  2. unittest自动化测试-requests库实现http请求与requests库离线安装
  3. 初学者如何选购第一把吉他?新手注意这几点,告别选择困难!附上10款高性价比入门吉他推荐!
  4. 2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(5)
  5. 安卓性能优化(响应优化)
  6. CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)
  7. 转载 NLS_LANG设置
  8. Win11默认下载路径设置教程
  9. 银联错失的良机,“网联”来补上
  10. Python3导入scrapy报错1 in C:\Users\ADMINI~1\AppData\Local\Temp\pip-install-831gxniz\Twisted\