700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 完整实例实现QQ表情的发送和接收

完整实例实现QQ表情的发送和接收

时间:2022-03-10 13:43:11

相关推荐

完整实例实现QQ表情的发送和接收

先看一下效果图:

首先进入界面:(完全仿照QQ)

点击一下上面的表情图标:

选择一些表情,输入一些文字混合:

点击发送:

可以看到文字和表情图片都一起显示出来了。

下面列出一些关键代码:

表情工具类ExpressionUtil:

[java]view plaincopypublicclassExpressionUtil{ /** *对spanableString进行正则判断,如果符合要求,则以表情图片代替 *@paramcontext *@paramspannableString *@parampatten *@paramstart *@throwsSecurityException *@throwsNoSuchFieldException *@throwsNumberFormatException *@throwsIllegalArgumentException *@throwsIllegalAccessException */ publicstaticvoiddealExpression(Contextcontext,SpannableStringspannableString,Patternpatten,intstart)throwsSecurityException,NoSuchFieldException,NumberFormatException,IllegalArgumentException,IllegalAccessException{ Matchermatcher=patten.matcher(spannableString); while(matcher.find()){ Stringkey=matcher.group(); if(matcher.start()<start){ continue; } Fieldfield=R.drawable.class.getDeclaredField(key); intresId=Integer.parseInt(field.get(null).toString());//通过上面匹配得到的字符串来生成图片资源id if(resId!=0){ Bitmapbitmap=BitmapFactory.decodeResource(context.getResources(),resId); ImageSpanimageSpan=newImageSpan(bitmap);//通过图片资源id来得到bitmap,用一个ImageSpan来包装 intend=matcher.start()+key.length();//计算该图片名字的长度,也就是要替换的字符串的长度 spannableString.setSpan(imageSpan,matcher.start(),end,Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//将该图片替换字符串中规定的位置中 if(end<spannableString.length()){//如果整个字符串还未验证完,则继续。。 dealExpression(context,spannableString,patten,end); } break; } } } /** *得到一个SpanableString对象,通过传入的字符串,并进行正则判断 *@paramcontext *@paramstr *@return */ publicstaticSpannableStringgetExpressionString(Contextcontext,Stringstr,Stringzhengze){ SpannableStringspannableString=newSpannableString(str); PatternsinaPatten=pile(zhengze,Pattern.CASE_INSENSITIVE);//通过传入的正则表达式来生成一个pattern try{ dealExpression(context,spannableString,sinaPatten,0); }catch(Exceptione){ Log.e("dealExpression",e.getMessage()); } returnspannableString; } }

在显示聊天页面的list的适配器中,我们需要做如下的显示,即调用上面工具类的方法:

SimpleChatAdapter中的内部类ViewHolder:

[java]view plaincopyprivateclassViewHolder{ RelativeLayoutchat_layout; ImageViewimage; TextViewtext; publicViewHolder(ViewconvertView){ chat_layout=(RelativeLayout)convertView.findViewById(R.id.team_singlechat_id_listiteam); image=(ImageView)convertView.findViewById(R.id.team_singlechat_id_listiteam_headicon); text=(TextView)convertView.findViewById(R.id.team_singlechat_id_listiteam_message); } publicvoidsetData(MessageInfomsg){ RelativeLayout.LayoutParamsrl_chat_left=((RelativeLayout.LayoutParams)chat_layout.getLayoutParams()); RelativeLayout.LayoutParamsrl_tv_msg_left=((RelativeLayout.LayoutParams)text.getLayoutParams()); RelativeLayout.LayoutParamsrl_iv_headicon_left=((RelativeLayout.LayoutParams)image.getLayoutParams()); if(!DicqConstant.DEFAULTMAC.equalsIgnoreCase(msg.getUsermac())){//根据本地的mac地址来判断该条信息是属于本人所说还是对方所说 //如果是自己说的,则显示在右边;如果是对方所说,则显示在左边 rl_chat_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT,-1); rl_chat_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,0); rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT,-1); rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,0); rl_tv_msg_left.addRule(RelativeLayout.RIGHT_OF,R.id.team_singlechat_id_listiteam_headicon); rl_tv_msg_left.addRule(RelativeLayout.LEFT_OF,0); text.setBackgroundResource(R.drawable.balloon_l_selector); }else{ rl_chat_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT,0); rl_chat_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,-1); rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT,0); rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,-1); rl_tv_msg_left.addRule(RelativeLayout.RIGHT_OF,0); rl_tv_msg_left.addRule(RelativeLayout.LEFT_OF,R.id.team_singlechat_id_listiteam_headicon); text.setBackgroundResource(R.drawable.balloon_r_selector); } image.setImageResource(PrortaitUtils.conversionIdToRes(msg.getProtrait()));//设置头像 Stringstr=msg.getMsg();//消息具体内容 Stringzhengze="f0[0-9]{2}|f10[0-7]";//正则表达式,用来判断消息内是否有表情 try{ SpannableStringspannableString=ExpressionUtil.getExpressionString(context,str,zhengze); text.setText(spannableString); }catch(NumberFormatExceptione){ e.printStackTrace(); }catch(SecurityExceptione){ e.printStackTrace(); }catch(IllegalArgumentExceptione){ e.printStackTrace(); } } }

关于表情弹出框的实现如下:

MainActivity:

[java]view plaincopy/** *创建一个表情选择对话框 */ privatevoidcreateExpressionDialog(){ builder=newDialog(MainActivity.this); GridViewgridView=createGridView(); builder.setContentView(gridView); builder.setTitle("默认表情"); builder.show(); gridView.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2, longarg3){ Bitmapbitmap=null; bitmap=BitmapFactory.decodeResource(getResources(),imageIds[arg2%imageIds.length]); ImageSpanimageSpan=newImageSpan(MainActivity.this,bitmap); Stringstr=null; if(arg2<10){ str="f00"+arg2; }elseif(arg2<100){ str="f0"+arg2; }else{ str="f"+arg2; } SpannableStringspannableString=newSpannableString(str); spannableString.setSpan(imageSpan,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); edit.append(spannableString); builder.dismiss(); } }); } /** *生成一个表情对话框中的gridview *@return */ privateGridViewcreateGridView(){ finalGridViewview=newGridView(this); List<Map<String,Object>>listItems=newArrayList<Map<String,Object>>(); //生成107个表情的id,封装 for(inti=0;i<107;i++){ try{ if(i<10){ Fieldfield=R.drawable.class.getDeclaredField("f00"+i); intresourceId=Integer.parseInt(field.get(null).toString()); imageIds[i]=resourceId; }elseif(i<100){ Fieldfield=R.drawable.class.getDeclaredField("f0"+i); intresourceId=Integer.parseInt(field.get(null).toString()); imageIds[i]=resourceId; }else{ Fieldfield=R.drawable.class.getDeclaredField("f"+i); intresourceId=Integer.parseInt(field.get(null).toString()); imageIds[i]=resourceId; } }catch(NumberFormatExceptione){ e.printStackTrace(); }catch(SecurityExceptione){ e.printStackTrace(); }catch(IllegalArgumentExceptione){ e.printStackTrace(); }catch(NoSuchFieldExceptione){ e.printStackTrace(); }catch(IllegalAccessExceptione){ e.printStackTrace(); } Map<String,Object>listItem=newHashMap<String,Object>(); listItem.put("image",imageIds[i]); listItems.add(listItem); } SimpleAdaptersimpleAdapter=newSimpleAdapter(this,listItems,R.layout.team_layout_single_expression_cell,newString[]{"image"},newint[]{R.id.image}); view.setAdapter(simpleAdapter); view.setNumColumns(6); view.setBackgroundColor(Color.rgb(214,211,214)); view.setHorizontalSpacing(1); view.setVerticalSpacing(1); view.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); view.setGravity(Gravity.CENTER); returnview; }

Demo下载:/detail/duancanmeng/4382260

转载自:/duancanmeng/article/details/7677144

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。