当前位置: 首页 > news >正文

Android开发技巧:像QQ一样输入表情图像

本文截选自《Android开发权威指南》,转载请注明作者和出处!


 EditText和TextView一样,也可以进行图文混排。所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示, 也可混合输入文字和图像,让我们先回顾一下图5.2所示的QQ聊天输入框,在输入框中可以同时输入文字和表情图像。实际上,这种效果在Android SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动,先来欣赏一下即将实现的效果,如图5.16所示。



图5.16  在EditText控件中输入文字和图像

     为了实现这个程序,首先来准备一些要用到的素材,也就是要在EditText控件中输入的图像文件。本例准备了9个png图像文件(face1.png至face9.png),都放在了res\drawable目录中。
接下来在屏幕上放一个只能显示3行(可输入多行)的EditText和一个Button,布局文件的代码如下:

<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"  android:layout_width ="fill_parent"
    android:layout_height
="fill_parent" >
     < EditText  android:id ="@+id/edittext"  android:layout_width ="fill_parent"
        android:layout_height
="wrap_content"  android:lines ="3"  android:gravity ="left|top" />
     < Button  android:layout_width ="wrap_content"
        android:layout_height
="wrap_content"  android:text ="随机插入表情"
        android:onClick
="onClick_RandomFace"  android:layout_marginTop ="10dp"   />
</ LinearLayout >


     上面代码的<EditText>标签中将android:gravity属性值设为left|top。以使输入的文本从左上角开始显 示,如果不设置该属性,则输入的文本会从左侧中心位置开始显示(由于设置了android:line=”3”,因此,EditText可同时显示三行的内 容,所以会存在这个问题,如果只显示一行,则不存在这个问题)。

     <Button>标签的android:onClick属性值指定了单击事件方法(onClick_RandomFace),在该方法 中随机获得了face1.png至face9.png中任意一个图像资源的ID。最常用的方法是将这9个图像资源ID放到数组中,然后随机产生一个数组索 引来获取相应的图像资源ID。但本例未采用这种方法,而是采用了直接通过反射技术从R.drawable类中获得图像资源ID的方法。这种方法的好处是一 但图像资源非常多时,可以不需要在数组中挨个定义就可以获得任意的图像资源ID。

     在5.2.2节使用了<img>标签来插入图像,虽然在EditText控件中插入图像也可采用这种方法。但本例使用了另外一种更简单 的方法,就是使用android.text.style.ImageSpan类来直接插入图像。下面来看看具体的实现代码。
public  void onClick_RandomFace(View view)
{
             //   随机产生1至9的整数
     int randomId = 1 +  new Random().nextInt(9);
     try
    {
         //   根据随机产生的1至9的整数从R.drawable类中获得相应资源ID(静态变量)的Field对象
        Field field = R.drawable. class.getDeclaredField("face" + randomId);
         //   获得资源ID的值,也就是静态变量的值
         int resourceId = Integer.parseInt(field.get( null).toString());
         //   根据资源ID获得资源图像的Bitmap对象
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
         //   根据Bitmap对象创建ImageSpan对象
        ImageSpan imageSpan =  new ImageSpan( this, bitmap);
         //   创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
        SpannableString spannableString =  new SpannableString("face");
         //   用ImageSpan对象替换face
        spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         //   将随机获得的图像追加到EditText控件的最后
        edittext.append(spannableString);
    }
     catch (Exception e)
    {
    }
}

编写上面代码需要注意如下几点。
1.  由于R.drawable中的资源ID都是public的静态变量,因此,可直接使用Field.get方法获得这些变量的值。如果是 private或protected的变量,需要field.setAccessible(true)设置变量值的访问权限才可以读写这些变量。
2.  使用Field.get方法获得变量值时,如果是静态变量。Field.get方法的参数值设为null即可。如果不是静态变量,需要为Field.get方法指定一个变量所在类的对象作为参数值。
3.  由于EditText类不能直接插入Span对象,因此,需要先使用SpannableString对象来封装Span对象(如本例中的ImageSpan对象),再将SpannableString对象插入到EditText控件中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux有时会出现“You have new mail in /var/spool/mail/root”
  • Spring-data-jpa复杂查询示例
  • 美联邦贸易委员会强令最差ISP下线
  • 数学 --- 高斯消元 POJ 1830
  • 备份物理服务器以及vCenter Server上的配置信息
  • [转]windows性能计时器
  • jquery实战---标签页效果
  • 前言
  • 在Android Studio中使用shareSDK进行社会化分享(图文教程)
  • 如何在LightSwitch中创建多栏自动完成的下拉框
  • erLang语言特性及游戏应用的可行性分析
  • MongoDB远程主从部署下的全量数据同步及故障恢复策略
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • Windows2003发布MVC4网站
  • 面试中如何介绍自己做过的运维项目
  • ES6指北【2】—— 箭头函数
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2018一半小结一波
  • android 一些 utils
  • bootstrap创建登录注册页面
  • gulp 教程
  • JavaWeb(学习笔记二)
  • storm drpc实例
  • 不上全站https的网站你们就等着被恶心死吧
  • 京东美团研发面经
  • 聊聊flink的TableFactory
  • 如何用vue打造一个移动端音乐播放器
  • 设计模式走一遍---观察者模式
  • 移动端 h5开发相关内容总结(三)
  • gunicorn工作原理
  • hi-nginx-1.3.4编译安装
  • 阿里云服务器购买完整流程
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.ajax()
  • (~_~)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (接口封装)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三)docker:Dockerfile构建容器运行jar包
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)Mysql的优化设置
  • (转)用.Net的File控件上传文件的解决方案
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET的数据绑定
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .Net中wcf服务生成及调用