QQ国际版 别人发的cf自定义表情情都是裂的 怎么破

4950人阅读
Android应用开源项目解读(5)
上一节呢,我们解读了一个,这节呢,&我们谈谈自定义表情,如、微信等,正好前两天看到一个仿的一个应用,虽然还是有许多需要完善的地方,&不过对于自定义表情功能,做的也是比较成熟了,这里要谢谢,下面我带领大家来一起学习一下他的这个功能实现。
根据上一节的分析呢,这节我就简要的直奔主题说了,页面布局、架构和流程都不说了。&感兴趣的可以自己看代码。
咱们先来看看他的资源文件夹
g文件夹放的是图,如
p文件夹放的是静态图
再来看看怎么添加表情
当选中的某一个表情的时候,触发事件
// 单击表情执行的操作
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view,int position, long id) {
String png = ((TextView) ((LinearLayout) view).getChildAt(1)).getText().toString();
if (!png.contains(&_del&)) {// 如果不是删除图标
ExpressionUtil.insert(editText,ExpressionUtil.getFace(context,png));
ExpressionUtil.delete(editText);
} catch (Exception e) {
e.printStackTrace();
});注意这行代码
ExpressionUtil.insert(editText,ExpressionUtil.getFace(context,png));就是添加表情的了
先来看看是怎么组装的样式的呢?
public static SpannableStringBuilder getFace(Context mContext,String png) {
SpannableStringBuilder sb = new SpannableStringBuilder();
* 经过测试,虽然这里tempText被替换为png显示,但是但我单击发送按钮时,获取到輸入框的内容是tempText的值而不是png
* 所以这里对这个tempText值做特殊处理
* 格式:#[face/png/f_static_000.png]#,以方便判斷當前圖片是哪一個
String tempText = &[& + png + &]&;
sb.append(tempText);
sb.setSpan(
new ImageSpan(mContext, BitmapFactory
.decodeStream(mContext.getAssets().open(png))), sb.length()
- tempText.length(), sb.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {
e.printStackTrace();
}大家可以看看这个类的继承关系,实现了接口,相当于一个样式的建造者,看到就很容易的会联想到建造者模式的,功能如其名,的确也是这样做的。
这是设置好字符串后,又设置了样式,在指定的位置设置图片样式。
然后就是设置的了
* 向输入框里添加表情
public static void insert(EditText input,CharSequence text) {
int iCursorStart = Selection.getSelectionStart((input.getText()));
int iCursorEnd = Selection.getSelectionEnd((input.getText()));
if (iCursorStart != iCursorEnd) {
((Editable) input.getText()).replace(iCursorStart, iCursorEnd, &&);
int iCursor = Selection.getSelectionEnd((input.getText()));
((Editable) input.getText()).insert(iCursor, text);
}分为种,和之前分析的系统表情方式差不多,假如游标不一致,其实就是选中了多个,就先用空串替换掉选中的表情,其实就是删除掉了,然后取得最新的游标,添加需要添加的表情。
然后来看看删除表情
ExpressionUtil的方法
* 删除图标执行事件
* 注:如果删除的是表情,在删除时实际删除的是tempText即图片占位的字符串,所以必需一次性删除掉tempText,才能将图片删除
public static void delete(EditText input) {
if (input.getText().length() != 0) {
int iCursorEnd = Selection.getSelectionEnd(input.getText());
int iCursorStart = Selection.getSelectionStart(input.getText());
if (iCursorEnd & 0) {
if (iCursorEnd == iCursorStart) {
if (isDeletePng(input,iCursorEnd)) {
String st = &[p/_000.png]&;
((Editable) input.getText()).delete(
iCursorEnd - st.length(), iCursorEnd);
((Editable) input.getText()).delete(iCursorEnd - 1,
iCursorEnd);
((Editable) input.getText()).delete(iCursorStart,
iCursorEnd);
}这个删除表情的做法和上一节介绍的就明显不同了,&上次那个是系统表情,也就是说是系统字符单元,直接交给,系统就会自动删除,当然前提是给他一个删除的事件额。
这个方法的备注要明确说明了,删除是删除图片占位的字串,这里有种情况,第种是删除游标内的内容,这个比较简单,直接取得游标的起止位置,删除掉就好了,第种是删除普通文字,这个只要删除最后一个字符就好了,&最后一种就比较复杂了,是删除表情,大家来想一下,是不是首先得知道我要删除的是不是表情吧?
这里用到了的方法
* 判断即将删除的字符串是否是图片占位字符串tempText 如果是:则讲删除整个tempText
public static boolean
isDeletePng(EditText input,int cursor) {
String st = &[p/_000.png]&;
String content = input.getText().toString().substring(0, cursor);
if (content.length() &= st.length()) {
String checkStr = content.substring(content.length() - st.length(),content.length());
String regex = &\\[[^\\]]+\\]&;
Pattern p = pile(regex);
Matcher m = p.matcher(checkStr);
return m.matches();
}我觉得这个方法是整个项目的难点重点,作者的实现方法也比较优雅,这里的策略是根据咱们商量的添加表情的格式,来倒推最后一个应该去匹配是不是表情的字串,如果符合表情的标准就是了,这里在裁剪出目标检查表情后,用了正则表达式来做了一次匹配,不会正则的真的要好好学习了,有的时候,可以起到很好的效果,好了这样是不是要删除的表情的方法就讲解完了。
如果检查是表情的话,紧接着就是删除了,也就是删除的起止位置,结束位置知道了,&开始位置就是结束位置减去表情格式字符数就是喽。
到目前为止呢,&自定义表情的实现分析就已经结束了,结合上一节的系统表情,表情的分析就到此结束了。后续大家如果还有什么问题,或者有不正确的地方,&可以提出来,共同探讨。
白玉梁的专栏&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:151639次
积分:1790
积分:1790
排名:第18083名
原创:35篇
评论:112条
阅读:48578
文章:18篇
阅读:64981已收藏本页面
本人当兵的。。。。。。标准割。。。。。一天别人在QQ上问我干什么的,我想有一个表情是大兵就发了过去(没错,就是那个带了个帽子吸烟的表情),后来他还问我是干什么的,我见他不懂就用文字告诉他,这不是高潮,高潮是我今天聊天突然发现那个表情是“装逼”的意思,突然明白好友为何如此迷茫。。。不说了,我再哭会。。。。。
你确定他不是以为你戴了绿帽子?
那个表情其实是绿了的意思。。
后才能发表评论
你可能喜欢的图片笑话
最受欢迎的爆笑笑话人人网 - 抱歉
哦,抱歉,好像看不到了
现在你可以:
看看其它好友写了什么
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&查看: 6054|回复: 12
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分18474 点注册时间最后登录
我用的09正式版,我和别人聊天的时候,我发自定义表情,他们就看不到。。。
但是他们给我发我就看得到。。。。
我如果在群里或讨论组里发的话,所有人就都能看到。。。
这是什么原因啊??.
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分7791 点注册时间最后登录
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分18474 点注册时间最后登录
下面是引用ninjia874于 09:47发表的:
完毕 内网能上QQ吗?
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分7791 点注册时间最后登录
能啊,我就在上,但是发图不能- -
今年PSP上的大作真多~
审判者, 积分 17590, 距离下一级还需 2410 积分
精华0帖子威望0 点积分17591 点注册时间最后登录
截个图看看~~~~~~~
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分18474 点注册时间最后登录
下面是引用ninjia874于 09:50发表的:
能啊,我就在上,但是发图不能- - 啊???那为啥我在群里发别人就能看到啊???
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分18474 点注册时间最后登录
下面是引用莉萨于 09:51发表的:
截个图看看~~~~~~~ 截了,对方看不到,读一会儿是个X。。。。
我が大和の撫子は天下無双!!!
屠龙者, 积分 66409, 距离下一级还需 3591 积分
精华1帖子威望1 点积分66409 点注册时间最后登录
网络问题。。。。。。。。。。。。
今年PSP上的大作真多~
审判者, 积分 17590, 距离下一级还需 2410 积分
精华0帖子威望0 点积分17591 点注册时间最后登录
不怎么上Q了,我用学校的电脑上A9,经常出错&&开个网页要刷N次&&不是网速的事
该用户已被禁言
该用户已被禁言
精华0帖子威望0 点积分18474 点注册时间最后登录
原来我也是这个网啊,我发表情别人就能看到啊。。。。。。。。。。。。
Powered by
扫描二维码
下载 A9VG 客户端(iOS, Android)

我要回帖

更多关于 pvz2国际版时空裂缝 的文章

 

随机推荐