这是一篇好文章,我转来收藏,技术的最高境界是分享。

最近在搞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工程进行下载)

  1. public void getFriendList() throws Exception {
  2. BlogReleaseServiceImpl service = new BlogReleaseServiceImpl();
  3. List<Emotions> list = service.getEmotion();
  4. for (Emotions emotions : list) {
  5. String path = emotions.getUrl();
  6. String filename = path.substring(path.lastIndexOf("/") + 1,path.length());
  7. URL url =  new URL(path);
  8. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  9. conn.setRequestMethod("GET");
  10. conn.setReadTimeout(5 * 1000);
  11. if(conn.getResponseCode() == 200){
  12. InputStream is = conn.getInputStream();
  13. byte[] data = readStream(is);
  14. File file = new File("f: \\sina_images\\" + filename);
  15. FileOutputStream fs = new FileOutputStream(file);
  16. fs.write(data);
  17. fs.close();
  18. }else{
  19. System.out.println("请求失败");
  20. }
  21. }
  22. }
  23. public byte[] readStream(InputStream is) throws Exception {
  24. ByteArrayOutputStream os = new ByteArrayOutputStream();
  25. byte[] buffer = new byte[2048];
  26. int len = 0;
  27. while((len = is.read(buffer)) != -1){
  28. os.write(buffer,0,len);
  29. }
  30. is.close();
  31. return os.toByteArray();
  32. }

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

3:

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

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

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

3.4sax解析

4:

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

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

 

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

  1. public void addexpression(View view){
  2. if (expressionGriView.getVisibility() == View.GONE) {
  3. expressionGriView.setVisibility(View.VISIBLE);
  4. emotionList = BlogHomeActivity.emotions;
  5. ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
  6. for(int i=0;i<70;i++)
  7. {
  8. emtions = emotionList.get(i);
  9. if (emtions != null) {
  10. HashMap<String, Object> map = new HashMap<String, Object>();
  11. Field f;
  12. try {
  13. f = (Field)R.drawable.class.getDeclaredField(emtions.getImageName());
  14. int j = f.getInt(R.drawable.class);
  15. map.put("ItemImage", j);//添加图像资源的ID
  16. lstImageItem.add(map);
  17. } catch (SecurityException e) {
  18. e.printStackTrace();
  19. } catch (NoSuchFieldException e) {
  20. e.printStackTrace();
  21. }catch (IllegalArgumentException e) {
  22. e.printStackTrace();
  23. } catch (IllegalAccessException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
  29. SimpleAdapter saImageItems = new SimpleAdapter(this,
  30. lstImageItem,//数据来源
  31. R.layout.blog_emotion_list,
  32. //动态数组与ImageItem对应的子项
  33. new String[] {"ItemImage"},
  34. //ImageItem的XML文件里面的一个ImageView
  35. new int[] {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转换为图片:

  1. public SpannableString txtToImg(String content){
  2. SpannableString ss = new SpannableString(content);
  3. int starts = 0;
  4. int end = 0;
  5. if(content.indexOf("[", starts) != -1 && content.indexOf("]", end) != -1){
  6. starts = content.indexOf("[", starts);
  7. end = content.indexOf("]", end);
  8. String phrase = content.substring(starts,end + 1);
  9. String imageName = "";
  10. List<Emotions> list = BlogHomeActivity.emotions;
  11. for (Emotions emotions : list) {
  12. if (emotions.getPhrase().equals(phrase)) {
  13. imageName = emotions.getImageName();
  14. }
  15. }
  16. try {
  17. Field f = (Field)R.drawable.class.getDeclaredField(imageName);
  18. int i= f.getInt(R.drawable.class);
  19. Drawable drawable = BlogSendMsgActivity.this.getResources().getDrawable(i);
  20. if (drawable != null) {
  21. drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
  22. ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
  23. ss.setSpan(span, starts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  24. }
  25. } catch (SecurityException e) {
  26. e.printStackTrace();
  27. } catch (NoSuchFieldException e) {
  28. e.printStackTrace();
  29. } catch (IllegalArgumentException e) {
  30. e.printStackTrace();
  31. } catch (IllegalAccessException e) {
  32. }
  33. }
  34. return ss;
  35. }

5.2:插入EditText

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

写完收工,给个效果图:

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

android 新浪微博客户端的表情功能的实现的更多相关文章

  1. Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

    原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...

  2. Android新浪微博客户端(六)——Home界面的ListView

    原文出自:方杰|http://fangjie.info/?p=184转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54该项目代码已经放到github:http ...

  3. Android新浪微博客户端(五)——主界面的TabHost和WeiboUtil

    原文出自:方杰|http://fangjie.info/?p=183转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54 该项目代码已经放到github:htt ...

  4. Android新浪微博客户端(四)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...

  5. Android新浪微博客户端(三)——添加多个账户及认证

    原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处 一.微博OAuth2.0认证 首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的de ...

  6. Android新浪微博客户端(一)——主框架搭建

    原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...

  7. Android新浪微博客户端(二)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=69  转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...

  8. android开发新浪微博客户端 完整攻略 [新手必读]

    开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...

  9. Android应用--新浪微博客户端新特性滚动视图和启动界面实现

    新浪微博客户端新特性滚动视图和启动界面实现 2013年8月20日新浪微博客户端开发之启动界面实现 前言: 使用过新浪微博客户端的童鞋都清楚,客户端每一次升级之后第一次启动界面就会有新特性的介绍,用户通 ...

随机推荐

  1. Oracle VM VirtualBox 随系统自动启动虚拟机的方法

    Oracle VM VirtualBox 随系统自动开启虚拟机的方法 @ECHO OFFcd..cd E:cd..cd E:\VirtualBox\start VirtualBox.exe -star ...

  2. 关于链接target的问题

    <a href="http://www.baidu.com" target="_blank">点击链接</a> target: _bla ...

  3. AngularJs练习Demo13Provider_factory

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  4. canvas ---1

    Canvas1 (关键词:canvas)   canvas :就是html5中提供的一个标签,只是用来展示绘图的内容 canvas  标签的默认宽高:300*150 如果给canvas来设置高度和宽度 ...

  5. MyEclipse笔记(2):debug的使用

    对于程序代码而言,学会调debug是重中之重,依此,掌握该技巧 以算1到50的和的代码为例: package com.front.action; public class debug { public ...

  6. Spring 学习笔记02

    用spring实现一个论坛基本功能 1 运行环境 Linux:Ubun 14.04 64bit IDE:IntelliJ IDEA 14.03 JDK:1.7.40 MySQL:5.5.44 Tomc ...

  7. mysql 存储过程与函数

    即事先经过编译并存储在数据库中的一段sql语言. 一.创建函数 创建格式: CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type ...

  8. C++ Primer 5th 第5章 语句

    和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...

  9. PHP页面中文乱码问题

    首先纯html页要用meta标签声明编码<meta http-equiv="Content-Type" content="text/html; charset=&q ...

  10. uC/OS-II中的时间 (转)

    时间是一个非常重要的概念,我们和朋友出去游玩需要约定一个时间,做事情也需要花费一段时间,总之,我们的生活离不开时间.操作系统也一样,也需要一个时间来规范其任务的执行. 我们生活中,时间的最小单位是秒, ...