android 新浪微部落格戶端的表情功能的實現

來源:互聯網
上載者:User

這是一篇好文章,我轉來收藏,技術的最高境界是分享。

 

最近在搞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工程進行下載)
public void getFriendList() throws Exception {BlogReleaseServiceImpl service = new BlogReleaseServiceImpl();List<Emotions> list = service.getEmotion();for (Emotions emotions : list) {String path = emotions.getUrl();String filename = path.substring(path.lastIndexOf("/") + 1,path.length());URL url =  new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setReadTimeout(5 * 1000);if(conn.getResponseCode() == 200){InputStream is = conn.getInputStream();byte[] data = readStream(is);File file = new File("f: \\sina_images\\" + filename);FileOutputStream fs = new FileOutputStream(file);fs.write(data);fs.close();}else{System.out.println("請求失敗");}}}public byte[] readStream(InputStream is) throws Exception {ByteArrayOutputStream os = new ByteArrayOutputStream();byte[] buffer = new byte[2048];int len = 0;while((len = is.read(buffer)) != -1){os.write(buffer,0,len);}is.close();return os.toByteArray();}
2:把本地的表情都放進android的資源檔裡----drawable下面(這個就不用多說了,直接選取所有檔案複製就行了)3:3.1訪問新浪的表情介面,把返回的資訊如下:
       <emotion><phrase>[嘻嘻]</phrase><type>face</type><url>http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c2/tooth.gif</url><is_hot>false</is_hot><is_common>true</is_common><order_number>0</order_number><category></category></emotion>
3.2 儲存在一個Emotion.java裡。Emotion.java代碼如下:
package com.uim.microblog.model;import java.io.Serializable;public class Emotions implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String phrase;//表情使用的替代文字private String type;private String url;//表情圖片存放的位置private String isHot;//是否為熱門表情private String isCommon;//是否屬於通用private String orderNumber;//該表情在系統中的排序號碼private String category;//表情分類private String imageName;//表情名稱public String getImageName() {return imageName;}public void setImageName(String imageName) {this.imageName = imageName;}public String getPhrase() {return phrase;}public void setPhrase(String phrase) {this.phrase = phrase;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getIsHot() {return isHot;}public void setIsHot(String isHot) {this.isHot = isHot;}public String getIsCommon() {return isCommon;}public void setIsCommon(String isCommon) {this.isCommon = isCommon;}public String getOrderNumber() {return orderNumber;}public void setOrderNumber(String orderNumber) {this.orderNumber = orderNumber;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}}

 

3.2 儲存在一個Emotion.java裡。Emotion.java代碼如下:

 

package com.uim.microblog.net.handler;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.uim.microblog.model.Emotions;import com.uim.microblog.model.ResponseResult;public class BlogEmotionsHandler extends DefaultHandler {private List<Emotions> list;private Emotions emotions;private ResponseResult responseresult;private String tag = null;//正在解析的元素public List<Emotions> getEmotionsList(){return list;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if (tag != null) {String textArea = new String(ch,start,length);/**開始解析表情資料*/if ("phrase".equals(tag)) {emotions.setPhrase(textArea);} else if ("type".equals(tag)) {emotions.setType(textArea);} else if ("url".equals(tag)) {try {emotions.setUrl(textArea);String imageName = textArea.substring(textArea.lastIndexOf("/") + 1,textArea.length() - 4);emotions.setImageName(imageName);} catch (Exception e) {e.printStackTrace();}} else if ("is_hot".equals(tag)) {emotions.setIsHot(textArea);} else if ("is_common".equals(tag)) {emotions.setIsCommon(textArea);} else if ("order_number".equals(tag)) {emotions.setOrderNumber(textArea);} else if ("category".equals(tag)) {emotions.setCategory(textArea);} else if ("retn".equals(tag)) {responseresult.setRetn(textArea);} else if ("desc".equals(tag)) {responseresult.setDesc(textArea);}}}@Overridepublic void endDocument() throws SAXException {super.endDocument();}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {tag = null;if ("mb".equals(localName)) {} else if ("emotions".equals(localName)) {responseresult =null;} else if ("emotion".equals(localName)) {list.add(emotions);emotions = null;} }@Overridepublic void startDocument() throws SAXException {list = new ArrayList<Emotions>();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if ("mb".equals(localName)) {responseresult = new ResponseResult();} else if ("emotions".equals(localName)) {} else if ("emotion".equals(localName)) {emotions = new Emotions();} tag = localName;}}
3.4sax解析
public List<Emotions> getEmotion(){BlogGetData getdata = new BlogGetData();String result = getdata.blogEmotionsServlet();try {//產生SAX解析對象parser = SAXParserFactory.newInstance().newSAXParser();//產生xml讀取器reader = parser.getXMLReader();BlogEmotionsHandler handler = new BlogEmotionsHandler();//設定Handlerreader.setContentHandler(handler);//指定檔案,進行解析reader.parse(new InputSource(new StringReader(result)));//擷取 List<Emotions>emotionList = handler.getEmotionsList();} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return emotionList;}
4:4.1實現表情選取器---GridView

 

<GridViewandroid:id="@+id/blog_sendmsg_gvemotion"android:layout_width="fill_parent"android:layout_height="150sp"android:scrollbars="vertical"android:numColumns="auto_fit"android:verticalSpacing="15dp"android:background="@color/blog_list_back"android:stretchMode="columnWidth"android:gravity="center"android:visibility="gone"android:columnWidth="40dp"></GridView>
4.2 GridView的item-----gridview_emotion_item.xml 
<?xml version="1.0" encoding="utf-8"?><LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent">  <ImageView  android:id="@+id/blog_sendmsg_emotion"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_weight="50"  android:layout_gravity="center">  </ImageView></LinearLayout>
 4.3代碼載入表情圖片到GridView進行顯示 
public void addexpression(View view){if (expressionGriView.getVisibility() == View.GONE) {expressionGriView.setVisibility(View.VISIBLE);emotionList = BlogHomeActivity.emotions;ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();       for(int i=0;i<70;i++)        {     emtions = emotionList.get(i);               if (emtions != null) {            HashMap<String, Object> map = new HashMap<String, Object>();                        Field f;try {f = (Field)R.drawable.class.getDeclaredField(emtions.getImageName());int j = f.getInt(R.drawable.class);        map.put("ItemImage", j);//添加映像資源的ID          lstImageItem.add(map);  } catch (SecurityException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}            }                }            //產生適配器的ImageItem <====> 動態數組的元素,兩者一一對應        SimpleAdapter saImageItems = new SimpleAdapter(this,                                                 lstImageItem,//資料來源                                                   R.layout.blog_emotion_list,                                                                                                  //動態數組與ImageItem對應的子項                                                          new String[] {"ItemImage"},                                                                                                     //ImageItem的XML檔案裡面的一個ImageView                                                new int[] {R.id.blog_sendmsg_emotion});              expressionGriView.setAdapter(saImageItems);  } else {expressionGriView.setVisibility(View.GONE);}}
5:實現點擊GridView的每一個item,處理根據item的index尋找對應的表情code,然後再把code利用正則把code轉換為相對應的表情圖片,最後表情插入EditText進行發送5.1:code轉換為圖片:

 

public SpannableString txtToImg(String content){SpannableString ss = new SpannableString(content);int starts = 0;int end = 0;if(content.indexOf("[", starts) != -1 && content.indexOf("]", end) != -1){starts = content.indexOf("[", starts);end = content.indexOf("]", end);String phrase = content.substring(starts,end + 1);String imageName = "";List<Emotions> list = BlogHomeActivity.emotions;for (Emotions emotions : list) {if (emotions.getPhrase().equals(phrase)) {imageName = emotions.getImageName();}}try {Field f = (Field)R.drawable.class.getDeclaredField(imageName);int i= f.getInt(R.drawable.class);Drawable drawable = BlogSendMsgActivity.this.getResources().getDrawable(i);  if (drawable != null) {drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());         ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);          ss.setSpan(span, starts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  }} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {}}return ss;}

 

5.2:插入EditText
emtions = emotionList.get(position);//擷取表情bean              int cursor = etcontent.getSelectionStart();              etcontent.getText().insert(cursor, txtToImg(emtions.getPhrase()));

 

寫完收工,給個:

 

轉自:http://jspjson.iteye.com/blog/1109222 

 

  作者:yiyaaixuexi 發表於2011-7-19 22:57:33 原文連結 閱讀:414 評論:1 查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.