最近在搞android 新浪微博客户端,有一些心得分享
弄android客户端表情功能可以用以下思路
1.首页把新浪的表情下载到本地一文件夹种,表情图片的命名要用新浪微博表情原来的命名
比如 新浪的害羞表情是shame.gif 那么你在本地也得命名为shame.gif,命名相同主要是为了能够匹配表情对应的code.
2.把本地的表情都放进android的资源文件里----drawable下面
3.访问新浪的表情接口(新浪返回的数据类型有json和xml两种,本人用xml),把返回的信息,利用xml解析器解析出来的信息储存在一个Emotion.java的bean里,这样就可以根据Emotion.java的code找到一一对应的资源表情图片了
4.实现一个可以让用户选择的表情界面,本人用GridView实现
5.实现点击GridView的每一个item,处理根据item的index查找对应的表情code,然后再把code利用正则把code转换为相对应的表情图片,最后表情插入EditText进行发送。

下面是具体的实现过程
1.把新浪表情图片下载到本地的实现如下:(这个可以建一个java工程进行下载)

Java代码
  1. publicvoidgetFriendList()throwsException{
  2. BlogReleaseServiceImplservice=newBlogReleaseServiceImpl();
  3. List<Emotions>list=service.getEmotion();
  4. for(Emotionsemotions:list){
  5. Stringpath=emotions.getUrl();
  6. Stringfilename=path.substring(path.lastIndexOf("/")+1,path.length());
  7. URLurl=newURL(path);
  8. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  9. conn.setRequestMethod("GET");
  10. conn.setReadTimeout(5*1000);
  11. if(conn.getResponseCode()==200){
  12. InputStreamis=conn.getInputStream();
  13. byte[]data=readStream(is);
  14. Filefile=newFile("f:\\sina_images\\"+filename);
  15. FileOutputStreamfs=newFileOutputStream(file);
  16. fs.write(data);
  17. fs.close();
  18. }else{
  19. System.out.println("请求失败");
  20. }
  21. }
  22. }
  23. publicbyte[]readStream(InputStreamis)throwsException{
  24. ByteArrayOutputStreamos=newByteArrayOutputStream();
  25. byte[]buffer=newbyte[2048];
  26. intlen=0;
  27. while((len=is.read(buffer))!=-1){
  28. os.write(buffer,0,len);
  29. }
  30. is.close();
  31. returnos.toByteArray();
  32. }

2:把本地的表情都放进android的资源文件里----drawable下面(这个就不用多说了,直接选取所有文件复制就行了)

3:

3.1访问新浪的表情接口,把返回的信息如下:

Xml代码
  1. <emotion>
  2. <phrase>[嘻嘻]</phrase>
  3. <type>face</type>
  4. <url>http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c2/tooth.gif
  5. </url>
  6. <is_hot>false</is_hot>
  7. <is_common>true</is_common>
  8. <order_number>0</order_number>
  9. <category></category>
  10. lt;/emotion>

3.2储存在一个Emotion.java里。Emotion.java代码如下:

Java代码
  1. packagecom.uim.microblog.model;
  2. importjava.io.Serializable;
  3. publicclassEmotionsimplementsSerializable{
  4. /**
  5. *
  6. */
  7. privatestaticfinallongserialVersionUID=1L;
  8. privateStringphrase;//表情使用的替代文字
  9. privateStringtype;
  10. privateStringurl;//表情图片存放的位置
  11. privateStringisHot;//是否为热门表情
  12. privateStringisCommon;//是否属于通用
  13. privateStringorderNumber;//该表情在系统中的排序号码
  14. privateStringcategory;//表情分类
  15. privateStringimageName;//表情名称
  16. publicStringgetImageName(){
  17. returnimageName;
  18. }
  19. publicvoidsetImageName(StringimageName){
  20. this.imageName=imageName;
  21. }
  22. publicStringgetPhrase(){
  23. returnphrase;
  24. }
  25. publicvoidsetPhrase(Stringphrase){
  26. this.phrase=phrase;
  27. }
  28. publicStringgetType(){
  29. returntype;
  30. }
  31. publicvoidsetType(Stringtype){
  32. this.type=type;
  33. }
  34. publicStringgetUrl(){
  35. returnurl;
  36. }
  37. publicvoidsetUrl(Stringurl){
  38. this.url=url;
  39. }
  40. publicStringgetIsHot(){
  41. returnisHot;
  42. }
  43. publicvoidsetIsHot(StringisHot){
  44. this.isHot=isHot;
  45. }
  46. publicStringgetIsCommon(){
  47. returnisCommon;
  48. }
  49. publicvoidsetIsCommon(StringisCommon){
  50. this.isCommon=isCommon;
  51. }
  52. publicStringgetOrderNumber(){
  53. returnorderNumber;
  54. }
  55. publicvoidsetOrderNumber(StringorderNumber){
  56. this.orderNumber=orderNumber;
  57. }
  58. publicStringgetCategory(){
  59. returncategory;
  60. }
  61. publicvoidsetCategory(Stringcategory){
  62. this.category=category;
  63. }
  64. }

3.3xm sax解析l的handler如下:

Java代码
  1. packagecom.uim.microblog.net.handler;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importorg.xml.sax.Attributes;
  5. importorg.xml.sax.SAXException;
  6. importorg.xml.sax.helpers.DefaultHandler;
  7. importcom.uim.microblog.model.Emotions;
  8. importcom.uim.microblog.model.ResponseResult;
  9. publicclassBlogEmotionsHandlerextendsDefaultHandler{
  10. privateList<Emotions>list;
  11. privateEmotionsemotions;
  12. privateResponseResultresponseresult;
  13. privateStringtag=null;//正在解析的元素
  14. publicList<Emotions>getEmotionsList(){
  15. returnlist;
  16. }
  17. @Override
  18. publicvoidcharacters(char[]ch,intstart,intlength)
  19. throwsSAXException{
  20. if(tag!=null){
  21. StringtextArea=newString(ch,start,length);
  22. /**开始解析表情数据*/
  23. if("phrase".equals(tag)){
  24. emotions.setPhrase(textArea);
  25. }elseif("type".equals(tag)){
  26. emotions.setType(textArea);
  27. }elseif("url".equals(tag)){
  28. try{
  29. emotions.setUrl(textArea);
  30. StringimageName=textArea.substring(textArea.lastIndexOf("/")+1,textArea.length()-4);
  31. emotions.setImageName(imageName);
  32. }catch(Exceptione){
  33. e.printStackTrace();
  34. }
  35. }elseif("is_hot".equals(tag)){
  36. emotions.setIsHot(textArea);
  37. }elseif("is_common".equals(tag)){
  38. emotions.setIsCommon(textArea);
  39. }elseif("order_number".equals(tag)){
  40. emotions.setOrderNumber(textArea);
  41. }elseif("category".equals(tag)){
  42. emotions.setCategory(textArea);
  43. }elseif("retn".equals(tag)){
  44. responseresult.setRetn(textArea);
  45. }elseif("desc".equals(tag)){
  46. responseresult.setDesc(textArea);
  47. }
  48. }
  49. }
  50. @Override
  51. publicvoidendDocument()throwsSAXException{
  52. super.endDocument();
  53. }
  54. @Override
  55. publicvoidendElement(Stringuri,StringlocalName,StringqName)
  56. throwsSAXException{
  57. tag=null;
  58. if("mb".equals(localName)){
  59. }elseif("emotions".equals(localName)){
  60. responseresult=null;
  61. }elseif("emotion".equals(localName)){
  62. list.add(emotions);
  63. emotions=null;
  64. }
  65. }
  66. @Override
  67. publicvoidstartDocument()throwsSAXException{
  68. list=newArrayList<Emotions>();
  69. }
  70. @Override
  71. publicvoidstartElement(Stringuri,StringlocalName,StringqName,
  72. Attributesattributes)throwsSAXException{
  73. if("mb".equals(localName)){
  74. responseresult=newResponseResult();
  75. }elseif("emotions".equals(localName)){
  76. }elseif("emotion".equals(localName)){
  77. emotions=newEmotions();
  78. }
  79. tag=localName;
  80. }
  81. }

3.4sax解析

Java代码
  1. publicList<Emotions>getEmotion(){
  2. BlogGetDatagetdata=newBlogGetData();
  3. Stringresult=getdata.blogEmotionsServlet();
  4. try{
  5. //生成SAX解析对象
  6. parser=SAXParserFactory.newInstance().newSAXParser();
  7. //生成xml读取器
  8. reader=parser.getXMLReader();
  9. BlogEmotionsHandlerhandler=newBlogEmotionsHandler();
  10. //设置Handler
  11. reader.setContentHandler(handler);
  12. //指定文件,进行解析
  13. reader.parse(newInputSource(newStringReader(result)));
  14. //获取List<Emotions>
  15. emotionList=handler.getEmotionsList();
  16. }catch(ParserConfigurationExceptione){
  17. e.printStackTrace();
  18. }catch(SAXExceptione){
  19. e.printStackTrace();
  20. }catch(IOExceptione){
  21. e.printStackTrace();
  22. }
  23. returnemotionList;
  24. }

4:

4.1实现表情选择器---GridView

Xml代码
  1. <GridView
  2. android:id="@+id/blog_sendmsg_gvemotion"
  3. android:layout_width="fill_parent"
  4. android:layout_height="150sp"
  5. android:scrollbars="vertical"
  6. android:numColumns="auto_fit"
  7. android:verticalSpacing="15dp"
  8. android:background="@color/blog_list_back"
  9. android:stretchMode="columnWidth"
  10. android:gravity="center"
  11. android:visibility="gone"
  12. android:columnWidth="40dp">
  13. </GridView>

4.2 GridView的item-----gridview_emotion_item.xml

Xml代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <ImageView
  7. android:id="@+id/blog_sendmsg_emotion"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_weight="50"
  11. android:layout_gravity="center">
  12. </ImageView>
  13. </LinearLayout>

4.3代码加载表情图片到GridView进行显示

Java代码
  1. publicvoidaddexpression(Viewview){
  2. if(expressionGriView.getVisibility()==View.GONE){
  3. expressionGriView.setVisibility(View.VISIBLE);
  4. emotionList=BlogHomeActivity.emotions;
  5. ArrayList<HashMap<String,Object>>lstImageItem=newArrayList<HashMap<String,Object>>();
  6. for(inti=0;i<70;i++)
  7. {
  8. emtions=emotionList.get(i);
  9. if(emtions!=null){
  10. HashMap<String,Object>map=newHashMap<String,Object>();
  11. Fieldf;
  12. try{
  13. f=(Field)R.drawable.class.getDeclaredField(emtions.getImageName());
  14. intj=f.getInt(R.drawable.class);
  15. map.put("ItemImage",j);//添加图像资源的ID
  16. lstImageItem.add(map);
  17. }catch(SecurityExceptione){
  18. e.printStackTrace();
  19. }catch(NoSuchFieldExceptione){
  20. e.printStackTrace();
  21. }catch(IllegalArgumentExceptione){
  22. e.printStackTrace();
  23. }catch(IllegalAccessExceptione){
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. //生成适配器的ImageItem<====>动态数组的元素,两者一一对应
  29. SimpleAdaptersaImageItems=newSimpleAdapter(this,
  30. lstImageItem,//数据来源
  31. R.layout.blog_emotion_list,
  32. //动态数组与ImageItem对应的子项
  33. newString[]{"ItemImage"},
  34. //ImageItem的XML文件里面的一个ImageView
  35. newint[]{R.id.blog_sendmsg_emotion});
  36. expressionGriView.setAdapter(saImageItems);
  37. }else{
  38. expressionGriView.setVisibility(View.GONE);
  39. }
  40. }

5:实现点击GridView的每一个item,处理根据item的index查找对应的表情code,然后再把code利用正则把code转换为相对应的表情图片,最后表情插入EditText进行发送

5.1:code转换为图片:

Java代码
  1. publicSpannableStringtxtToImg(Stringcontent){
  2. SpannableStringss=newSpannableString(content);
  3. intstarts=0;
  4. intend=0;
  5. if(content.indexOf("[",starts)!=-1&&content.indexOf("]",end)!=-1){
  6. starts=content.indexOf("[",starts);
  7. end=content.indexOf("]",end);
  8. Stringphrase=content.substring(starts,end+1);
  9. StringimageName="";
  10. List<Emotions>list=BlogHomeActivity.emotions;
  11. for(Emotionsemotions:list){
  12. if(emotions.getPhrase().equals(phrase)){
  13. imageName=emotions.getImageName();
  14. }
  15. }
  16. try{
  17. Fieldf=(Field)R.drawable.class.getDeclaredField(imageName);
  18. inti=f.getInt(R.drawable.class);
  19. Drawabledrawable=BlogSendMsgActivity.this.getResources().getDrawable(i);
  20. if(drawable!=null){
  21. drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
  22. ImageSpanspan=newImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
  23. ss.setSpan(span,starts,end+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  24. }
  25. }catch(SecurityExceptione){
  26. e.printStackTrace();
  27. }catch(NoSuchFieldExceptione){
  28. e.printStackTrace();
  29. }catch(IllegalArgumentExceptione){
  30. e.printStackTrace();
  31. }catch(IllegalAccessExceptione){
  32. }
  33. }
  34. returnss;
  35. }

5.2:插入EditText

Java代码
  1. emtions=emotionList.get(position);//获取表情bean
  2. intcursor=etcontent.getSelectionStart();
  3. etcontent.getText().insert(cursor,txtToImg(emtions.getPhrase()));

写完收工,给个效果图:


[置顶] android 新浪微博客户端的表情功能的实现_第1张图片

更多相关文章

  1. Android运行时权限,6.0—9.0多版本,多终端(手机,TV盒子)130行代码一劳
  2. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  3. android 使用handler更新ui,使用与原理分析详解(附上代码以及截图)
  4. 1、android源代码下载与跟踪
  5. android经典开源代码集合
  6. ReactNative调用原生封装的代码和控件
  7. Android开发人员不得不收集的代码(持续更新中)
  8. Android清除本地数据缓存代码

随机推荐

  1. Android(安卓)MD5加密算法
  2. Android(安卓)ListView复用机制详解
  3. Android接口安全 - RSA+AES混合加密方案
  4. 子线程更新UI的方法
  5. Android与JavaScrip进行交互(三)
  6. Android多媒体学习七:调用Android自带的音
  7. [转]Android中webview和js之间的交互
  8. Android 网络状态实时检测
  9. Android 短信列表的时间显示
  10. Android 中的Affinity