处理新浪微博中@ #等格式 蓝色高亮~ 表情 以及点击事件

news/2024/11/24 18:32:02/

先上图看效果

  

    




 表情只弄了一个,测试使用, 新浪微博接口中返回那么多表情 - -  还没处理,好像新浪微博客户端也有些没有处理到
  正则不会处理#的问题
如 : 其他文字#要的#不要的#要的#其他文字
最后会把  不要的  也给匹配到, 

 我用了笨点的方法处理了。。。

发关键代码,其他的下载附件 = = 

 TextUtils.java

 

[java]  view plain copy
  1. package com.zeng.span2.util;  
  2.   
  3. import java.lang.ref.SoftReference;  
  4. import java.lang.reflect.Field;  
  5. import java.util.ArrayList;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9. import java.util.regex.Matcher;  
  10. import java.util.regex.Pattern;  
  11.   
  12. import android.app.Activity;  
  13. import android.content.Context;  
  14. import android.content.Intent;  
  15. import android.graphics.Color;  
  16. import android.graphics.drawable.Drawable;  
  17. import android.net.Uri;  
  18. import android.text.Spannable;  
  19. import android.text.SpannableString;  
  20. import android.text.Spanned;  
  21. import android.text.method.LinkMovementMethod;  
  22. import android.text.style.ClickableSpan;  
  23. import android.text.style.ForegroundColorSpan;  
  24. import android.text.style.ImageSpan;  
  25. import android.view.View;  
  26. import android.widget.TextView;  
  27.   
  28. import com.zeng.span2.R;  
  29. import com.zeng.span2.TestPersonActivity;  
  30. import com.zeng.span2.TestTopicActivity;  
  31. import com.zeng.span2.model.Emotion;  
  32.   
  33. /** 
  34.  * 处理字体高亮 
  35.  *  
  36.  * @author zeng 
  37.  *  
  38.  */  
  39. public class TextUtils {  
  40.     private static List<Emotion> emotions = new ArrayList<Emotion>();  
  41.   
  42.     /** 
  43.      *  
  44.      * @param mContext 
  45.      * @param textview 
  46.      * @param content 
  47.      * @param hasClick 
  48.      *            是否添加click 
  49.      */  
  50.     public static void textViewSpan(Context mContext, TextView textview, String content, boolean hasClick) {  
  51.         List<PositionItem> list = paresString2(content);  
  52.         Spannable span = new SpannableString(content);  
  53.         // 测试表情  
  54.         Emotion emotion = new Emotion(  
  55.                 "http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_org.gif""[草泥马]");  
  56.         if (emotions.isEmpty())  
  57.             emotions.add(emotion);  
  58.         // 结束测试  
  59.   
  60.         for (PositionItem pi : list) {  
  61.             if (pi.getPrefixType() == 4) {  
  62.                 String imageName = "";  
  63.                 for (Emotion em : emotions) {  
  64.                     if (em.getPhrase().equals(pi.getContent())) {  
  65.                         imageName = em.getSaveName2();  
  66.                         break;  
  67.                     }  
  68.                 }  
  69.                 //  
  70.                 try {  
  71.                     Field f = (Field) R.drawable.class.getDeclaredField(imageName);  
  72.                     int eId = f.getInt(R.drawable.class);  
  73.                     Drawable drawable = mContext.getResources().getDrawable(eId);  
  74.                     if (drawable != null) {  
  75.                         drawable.setBounds(00, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
  76.                         ImageSpan imgSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
  77.                         span.setSpan(imgSpan, pi.start, pi.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  78.                     } else {  
  79.                         span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, pi.end,  
  80.                                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  81.                     }  
  82.                 } catch (Exception e) {  
  83.                     // TODO: handle exception  
  84.                     span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, pi.end,  
  85.                             Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  86.                 }  
  87.             } else {  
  88.                 if (hasClick)  
  89.                     span.setSpan(new TextClickSapn(mContext, pi), pi.start, pi.end,  
  90.                             Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  91.                 else  
  92.                     span.setSpan(new ForegroundColorSpan(Color.BLUE), pi.start, pi.end,  
  93.                             Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  94.             }  
  95.         }  
  96.         textview.setText(span);  
  97.         if (hasClick)  
  98.             textview.setMovementMethod(LinkMovementMethod.getInstance());  
  99.     }  
  100.   
  101.     public static List<PositionItem> paresString(String content) {  
  102.         String regex = "@[^\\s::《]+([\\s::《]|$)|#(.+?)#|http://t\\.cn/\\w+|\\[(.*?)\\]";  
  103.         Pattern p = Pattern.compile(regex);  
  104.         Matcher m = p.matcher(content);  
  105.         boolean b = m.find();  
  106.         List<PositionItem> list = new ArrayList<PositionItem>();  
  107.         while (b) {  
  108.             System.out.println(m.start());  
  109.             System.out.println(m.end());  
  110.             System.out.println(m.group());  
  111.             int start = m.start();  
  112.             int end = m.end();  
  113.             String str = m.group();  
  114.             list.add(new PositionItem(start, end, str, content.length()));  
  115.             b = m.find(m.end() - 1);  
  116.         }  
  117.         return list;  
  118.     }  
  119.   
  120.     /** 
  121.      * 这个是处理一条信息有多个#... 
  122.      *  
  123.      * @param content 
  124.      * @return 
  125.      */  
  126.     public static List<PositionItem> paresString2(String content) {  
  127.         String regex = "@[^\\s::《]+([\\s::《]|$)|#(.+?)#|http://t\\.cn/\\w+|\\[(.*?)\\]";  
  128.         Pattern p = Pattern.compile(regex);  
  129.         Matcher m = p.matcher(content);  
  130.         boolean b = m.find();  
  131.         List<PositionItem> list = new ArrayList<PositionItem>();  
  132.         int count = 0;  
  133.         int lastIndex = 0;  
  134.         while (b) {  
  135.             System.out.println(m.start());  
  136.             System.out.println(m.end());  
  137.             System.out.println(m.group());  
  138.             int start = m.start();  
  139.             int end = m.end();  
  140.             String str = m.group();  
  141.             if (str.startsWith("#")) {  
  142.                 count++;  
  143.                 if (count % 2 == 0) {  
  144.                     b = m.find(lastIndex);  
  145.                     continue;  
  146.                 }  
  147.             }  
  148.             list.add(new PositionItem(start, end, str, content.length()));  
  149.             b = m.find(m.end() - 1);  
  150.             try {  
  151.                 lastIndex = m.start() + 1;  
  152.             } catch (Exception e) {  
  153.                 // TODO: handle exception  
  154.             }  
  155.         }  
  156.   
  157.         return list;  
  158.     }  
  159.   
  160.   
  161.     private static class TextClickSapn extends ClickableSpan {  
  162.         private PositionItem item;  
  163.         private Context mContext;  
  164.   
  165.         public TextClickSapn(Context context, PositionItem item) {  
  166.             // TODO Auto-generated constructor stub  
  167.             this.item = item;  
  168.             this.mContext = context;  
  169.         }  
  170.   
  171.         @Override  
  172.         public void onClick(View widget) {  
  173.             // TODO Auto-generated method stub  
  174.             switch (item.getPrefixType()) {  
  175.             case 1:  
  176.                 Intent it_person = new Intent(mContext, TestPersonActivity.class);  
  177.                 it_person.putExtra("content", item.getContentWithoutPrefix());  
  178.                 mContext.startActivity(it_person);  
  179.                 break;  
  180.             case 2:  
  181.                 Intent it_topic = new Intent(mContext, TestTopicActivity.class);  
  182.                 it_topic.putExtra("content", item.getContentWithoutPrefix());  
  183.                 mContext.startActivity(it_topic);  
  184.                 break;  
  185.             case 3:  
  186.                 // 直接使用调用浏览器  
  187.                 // 这个是短链 ,还需要条用微博接口,转成原始连接 才能访问  
  188.                 // 先使用短链去调用接口,获取长链,再启动浏览器  
  189.                 Intent intent = new Intent();  
  190.                 // intent.setAction("android.intent.action.VIEW");  
  191.                 Uri content_url = Uri.parse("http://www.sina.com");  
  192.                 intent = new Intent(Intent.ACTION_VIEW);  
  193.                 intent.setData(content_url);  
  194.                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  195.                 mContext.startActivity(intent);  
  196.                 break;  
  197.             default:  
  198.                 break;  
  199.             }  
  200.         }  
  201.     }  
  202.   
  203.     public static class PositionItem {  
  204.         public int start;  
  205.         public int end;  
  206.         private int prefixType;  
  207.         private String content;  
  208.         private int strLenght;  
  209.   
  210.         public PositionItem(int start, int end, String content, int strLenght) {  
  211.             // TODO Auto-generated constructor stub  
  212.             this.start = start;  
  213.             this.end = end;  
  214.             this.content = content;  
  215.             this.strLenght = strLenght;  
  216.         }  
  217.   
  218.         public PositionItem(int start, int end, String content) {  
  219.             // TODO Auto-generated constructor stub  
  220.             this.start = start;  
  221.             this.end = end;  
  222.             this.content = content;  
  223.         }  
  224.   
  225.         public String getContent() {  
  226.             return content;  
  227.         }  
  228.   
  229.         public String getContentWithoutPrefix() {  
  230.             switch (getPrefixType()) {  
  231.             case 1:  
  232.                 if (end == strLenght)  
  233.                     return content.substring(1, strLenght);  
  234.                 return content.substring(1, content.length() - 1);  
  235.             case 2:  
  236.                 return content.substring(1, content.length() - 1);  
  237.             case 3:  
  238.                 return content;  
  239.             default:  
  240.                 return content;  
  241.             }  
  242.         }  
  243.   
  244.         /** 
  245.          * 1 @ 人物 2 # 话题 3 http://t.cn/ 短链 4 [ 表情 
  246.          *  
  247.          * @return 
  248.          */  
  249.         public int getPrefixType() {  
  250.             if (content.startsWith("@"))  
  251.                 return 1;  
  252.             if (content.startsWith("#"))  
  253.                 return 2;  
  254.             if (content.startsWith("http://"))  
  255.                 return 3;  
  256.             if (content.startsWith("["))  
  257.                 return 4;  
  258.             return -1;  
  259.         }  
  260.     }  
  261. }  

 若有好的办法处理#的问题,求告知!

下面是附件连接

  http://download.csdn.net/download/zgf1991/4888699

 点击打开链接


http://www.ppmy.cn/news/520752.html

相关文章

程序员们,你们再这样下去会没朋友的。

引言 写这篇文章&#xff0c;其实源于之前有个群里的同学&#xff0c;问了LZ一个问题。 当时他给LZ发了一张图片&#xff0c;然后问LZ&#xff0c;“这个Test注解引用不了是咋回事&#xff1f;”   看到这个问题&#xff0c;LZ当时恰好没事&#xff0c;就顺手给他回复了一下&…

Android开发如何写出优雅的代码

很多时候我们去面试&#xff0c;人家总会问一个问题&#xff0c;你们公司开发一个app是如何进行技术选择的&#xff0c;app中涉及到了哪些开发模式&#xff0c;谈谈你对mvc、mvp和mvvm的区别。或许在这些问题上每个人有每个人的看法&#xff0c;在我看来把代码写清楚&#xff0…

【小知识】有趣代码注释图案【持续收集更新...】

滑稽 滑稽 滑稽 滑稽 滑稽代码注释 /*** * .,, .,:;;iiiiiiiii;;:,,. .,, * rGB##HS,.;iirrrrriiiiiiiiiirrrrri;,s&##MAS, * …

干私活进坑,又一个程序员,被抓捕!(真实事件)

这篇文章是公号一位程序员读者的投稿&#xff0c;整个过程就是他自身的经历&#xff0c;文中涉及到的一些敏感点&#xff0c;进行了模糊处理。 文章中的“我”为作者本人。 1 你们张总在吗&#xff1f; 今年的冬天&#xff0c;小明日常到朋友公司蹭个位置坐点自己的事情&#x…

Android之Emoji表情开源库

上次做了一个表情的控件&#xff0c;不敢私藏&#xff0c;给大家分享效果图如下&#xff0c;图片是新浪微博的&#xff0c;该有的功能应该都有了。 这其实就是一个Fragment&#xff0c;所以用起来很方便&#xff0c;只要 FaceFragment faceFragment FaceFragment.Instance(); …

富文本转换字符串 php,layedit 富文本编辑器 php下字符与表情转换

在使用富文本编辑器layedit的时候&#xff0c;在添加表情的时候&#xff0c;编辑器会自动将表情拼成img标签展示。 当我们保存的时候就很尴尬了&#xff0c;一个表情占用了几十个字符&#xff0c;造成了大量的浪费。 所以&#xff0c;我们的需要保存成特定的字符&#xff0c;展…

vue 项目中使用 评论功能 带emoji表情包

先看下效果&#xff1a; 由于项目中需要做一个 评论的功能&#xff0c;思索一番 准备自己写&#xff0c;但打开度娘 一下就看到这个vue评论插件&#xff0c;带表情包 挺好的&#xff0c;还带表情 刚好满足需求 1.安装 2.引入插件3.使用 就不在介绍 上面的链接有 记录下我在项…

新浪微博表情代码以及对应的gif图片url

新浪微博表情代码以及对应的gif图片url api&#xff1a;https://api.weibo.com/2/emotions.json?source1362404091 var c [{icon : "http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif",value : "[草泥马]"}, {i…