`
phenom
  • 浏览: 406064 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

新浪微博的表情实现

 
阅读更多
关于表情的实现,sdk里面也提供一个表情的解析类,SmileyParser,,可以利用这个类来处理表情的。

它主要是构造了一个SpannableStringBuilder,然后里面添加ImageSpan,虽然打印出来的字符串与没有经过处理的一样,但经过这个处理后就可以显示图片了,有了ImageSpan,才有表情的显示。



关于微博的表情,可以从api里面下载。表情的格式大概是:

[{"phrase":"[织]","type":"face","url":"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/41/zz2_org.gif","hot":false,"common":true,"category":"","icon":"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/41/zz2_thumb.gif","value":"[织]","picid":""},

{"phrase":"[神马]",
"type":"face",
"url":"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_org.gif",
"hot":false,
"common":true,
"category":"",
"icon":"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif",
"value":"[神马]",
"picid":""},。。。这样的形式,

表情数量太多了,只解析 "common":true的,就是常用的表情。把里面的图片下载下来就可以用了。 

需要注意的是你的 "phrase":"[织]"这个名字不能随意地更改。关于这个名字对应什么图片是自己控制的,但不保证在其它的程序是显示正常。 

于是我就用一个map来存储:

public static final HashMap<String, Integer> mSmileyMap=new HashMap<String, Integer>();

static {
mSmileyMap.put("[织]", Integer.valueOf(R.drawable.zz2_org));
mSmileyMap.put("[神马]", Integer.valueOf(R.drawable.horse2_org));
mSmileyMap.put("[浮云]", Integer.valueOf(R.drawable.fuyun_org));
mSmileyMap.put("[给力]", Integer.valueOf(R.drawable.geili_org));
mSmileyMap.put("[围观]", Integer.valueOf(R.drawable.wg_org));
mSmileyMap.put("[威武]", Integer.valueOf(R.drawable.vw_org));
mSmileyMap.put("[熊猫]", Integer.valueOf(R.drawable.panda_org));
mSmileyMap.put("[兔子]", Integer.valueOf(R.drawable.rabbit_org));
mSmileyMap.put("[奥特曼]", Integer.valueOf(R.drawable.otm_org));
mSmileyMap.put("[囧]", Integer.valueOf(R.drawable.j_org));

。。。。其它不列出了。上面下载的是原始图片,如果要缩略图可以用 thumb.gif下载 。



然后开始构造表情的解析类:

单例。

构造 。

private AKSmileyParser(Context context) {
mContext=context;
mSmileyTexts=AKSmiley.mSmileyMap.keySet().toArray(new String[0]);
System.out.println("AKSmileyParser:"+mSmileyTexts+" ssm:"+AKSmiley.mSmileyMap.size());
mPattern=buildPattern();
} 

private Pattern buildPattern() {
int length=AKSmiley.mSmileyMap.size();
// Set the StringBuilder capacity with the assumption that the average
// smiley is 3 characters long.
StringBuilder patternString=new StringBuilder(length*3);

System.out.println("buildPattern:"+mSmileyTexts);
// Build a regex that looks like (:-)|:-(|...), but escaping the smilies
// properly so they will be interpreted literally by the regex matcher.
patternString.append("(");
for (String s : mSmileyTexts) {
patternString.append(Pattern.quote(s));
patternString.append('|');
}
// Replace the extra '|' with a ')'
patternString.replace(patternString.length()-1, patternString.length(), ")");

return Pattern.compile(patternString.toString());
}

然后就可以使用了。

初始化:

AKSmileyParser parser=AKSmileyParser.getInstance(this);

用gridview来显示表情。其中

holder.appImage.setImageDrawable(context.getResources().getDrawable(AKSmiley.mSmileyMap.get(list[index]))); 显示图片。


  private String[] list;//这个东西就是表情的key


@Override
public Object getItem(int index) {
return list[index];
}

初始化适配器:mAdapter.setList(AKSmileyParser.getInstance(this).mSmileyTexts);

表情显示成功了:

设置setOnItemClickListener事件:

String oldChar=edit_text.getText().toString();
  Log.d(TAG, "oldChar:"+oldChar);//原始字符

String charToBuild=(String) mAdapter.getItem(position);
  Log.d(TAG, "charToBuild:"+charToBuild);//新加入的字符,这个字符就是用map中的key:[神马]形式的

  int selection=edit_text.getSelectionStart();//需要知道当前选中的位置,因为表情是ImageSpan,不是字符串,所以选中的位置会不正确。
  CharSequence start=oldChar.subSequence(0, selection);//选中位置的开始点,从0开始
CharSequence end=oldChar.subSequence(selection, oldChar.length());
Log.d(TAG, "start:"+start+"---end:"+end+" selection:"+selection);

StringBuilder builder=new StringBuilder(start);
builder.append(charToBuild).append(end);//构造新的字符串,虽然表情用ImageSpan显示,但字符串的内容还是一样的。
int newSel=selection+charToBuild.length();//计算新的选中的光标位置,

AKSmileyParser parser=AKSmileyParser.getInstance(this);
  CharSequence newChar=parser.addSmileySpans(builder);//解析新的字符串,如果只解析新添加的部分,其它的还是会显示成字符串“[神马]”这样的,所以需要重新解析所有的

Log.d(TAG, "newChar:"+newChar+" newSel:"+newSel);

edit_text.setText(newChar);
edit_text.setSelection(newSel);//设置光标的新位置。
txt_text.setText(newChar);
日志显示:
//09-27 11:05:07: D: oldChar:神马[神马] d兔子[兔子]ad嘻嘻[嘻嘻]aa
//09-27 11:05:07: D: charToBuild:[哈哈]
//09-27 11:05:07: D: start:神马[神马] d兔---end:子[兔子]ad嘻嘻[嘻嘻]aa selection:9//在兔子中间插入
//09-27 11:05:07: D: newChar:神马[神马] d兔[哈哈]子[兔子]ad嘻嘻[嘻嘻]aa newSel:13

apk下载,源码暂时没有。稍后提供。上面已经提供了大多数了,部分不全的代码自己补全。




  • 大小: 161.2 KB
分享到:
评论

相关推荐

    新浪微博表情jQuery插件

    表情功能的实现虽说不难,但却比较繁琐,首先要了解新浪微博开放平台的表情API,然后通过某种方式调用,如果通过网页后台代码直接读取储存到JavaScript变量中,又会拖慢网页加载速度,如果采用AJAX读取,又要解决...

    js实现选中页面文字将其分享到新浪微博

    主要介绍了js实现选中页面文字将其分享到新浪微博,需要的朋友可以参考下

    新浪微博简单版本

    主要基于新浪微博第一页做的,第一页有的功能几乎都有,除了写博文没有表情和#话题以外都已经实现,适合新手~

    新浪微博 v4.0.0 iPhone版.zip

    新浪微博的手机客户端实现了: 轻松更新浏览你关注的好友、娱乐明星、专家发布的最新微博 即时获取国内外热点新闻,网络流行话题,好玩的视频和图片 随时随地分享照片、文字、地点或转发有趣的内容给好友 快捷发布...

    jquery高仿新浪微博图片显示插件

    完全仿照 新浪微博图片 显示 制作 公司要制作这样一个东东 花了一个礼拜写的 稍微改改完全满足你的需求的

    自定义表情键盘

    3、文字转表情的方法应该与新浪微博的不一样,我的实现很复杂(测试比较了我的和新浪微博的转化,先在textView中输入几百上千个表情,此时textView输入会变得很慢,新浪微博也是如此,因此新浪微博应该也是有遍历、...

    jQuery新浪微博发布页面代码

    jQuery新浪微博发布页面代码是一款可统计字数,发送表情,放大图片,添加编辑的内容的页面特效。

    仿新浪博客留言评论功能

    本功能已经完全实现,仿新浪博客下面的评论功能,并且实现了1楼到N楼的无限循环,引入了表情,并实现了分页功能,评分功能。支持头像显示,下载世界使用,里面css和sql文件都有,SQL文件导入数据库即可。我个人觉得值...

    仿新浪微博首页带多图cell自适应

    源码SkyMicroblogDemo,利用自动布局模仿新浪微博的首页消息显示,可以根据文字内容和图片的张数来实现cell的自适应,发现在网上类似新浪微博带有多张图片的cell自适应的资源非常少,所以自己研究了一下写了一个Demo...

    Android仿新浪微博、QQ空间等帖子显示(2)

    这是新浪微博的一个帖子,刚好包括了话题、表情、@好友三种显示。显示方法上篇已经阐述了,就是使用SpannableString。这篇主要介绍显示这种帖子的解析工具类。 二、实现 1.字符串表示和对应正则表达式 话题用##号括...

    新浪微博助手(&S)-crx插件

    动动鼠标即可把自己选中的图片、文字、以及视频的地址转播到新浪微博,您不必担心安全问题,因为这一切都是调用新浪微博官方API接口完成的.程序制作GodSon 4.0.7.0(2014-2-07) chrome更新API 4.0.7.0(2014-2-07)...

    Android仿新浪微博、QQ空间等帖子显示(1)

    Android系统通过SpannableString类来对指定文本进行相关处理,实际应用中用的比较多的地方比如聊天时显示表情啊,朋友圈或社区中话题的显示、@好友显示和点击等等,关键字显示不同颜色…… 1、BackgroundColorSpan ...

    记事狗微博系统 v3.0.0 beta GBK Build 20110916.rar

    记事狗微博系统是一套业界领先的开源PHP微博程序,其支持Web、手机、短信、QQ机器人等多种方式发布内容,并可通过QQ即时通知、站外调用、同步到新浪微博、腾讯微博(可使用微博账户登录、注册绑定)等传播内容,是...

    YiiPiN社会化电商分享系统 v1.3.zip

    (增强)后台增加新浪微博、QQ登录验证META设置 (新增)淘宝商品采集增加店铺搜索采集功能,不受API权限限制,并结合好店展示 (增强)后台淘宝客采集增加总成交量限制条件 (增强)后台淘宝客采集增加记录商品...

    MTCEO文库系统 v2.6.zip

    10、腾讯、新浪微博和淘宝一键登录支持! 11、标签机制,自由更改模板内容 12、发布文档时,文档分类采用竖排列结构,更清晰 13、修复了原有的虚拟空间与独立服务器的双选择模式 14、修复了10.0评分遮盖在星星...

    傲游浏览器v3.3.6.2000 [2012-3-22]

    * 侧边栏新浪微博插件表情资源更新 * 解决一些接口实现问题 * 脚本注入环境下ajax请求被拒绝 * PAGE_LOADED 会触发两次 3.3.5.1000 2012-03-01 本次更新包含下列新特性: + 对于特定的页面自动切换到兼容模式 ...

    飞秋2013专业版

    完全兼容网上广为流传的飞鸽传... 新浪微博:http://weibo.com/u/2460614315 您也可以上飞秋论坛发表您的建议或查看最新版本信息: 论坛地址: http://www.feiq18.com 在此非常感谢您的宝贵建议和意见! 作者:卢本陶

    MTCEO文库系统 v2.6

    10、腾讯、新浪微博和淘宝一键登录支持! 11、标签机制,自由更改模板内容 12、发布文档时,文档分类采用竖排列结构,更清晰 13、修复了原有的虚拟空间与独立服务器的双选择模式 14、修复了10.0评分遮盖在星星评分...

Global site tag (gtag.js) - Google Analytics