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

EditText(插入表情图片)

(创建于2016/11/15)

方式一:易会项目中的方式

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edittext = (EditText) findViewById(R.id.edittext);
    }

    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("f" + 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("f");
            // 用ImageSpan对象替换face,注意这里的0,1表示的是f的长度,因为图片名是f1...f2,如果是face1,face2那么这里就是0,4
            spannableString.setSpan(imageSpan, 0, 1,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            // 将随机获得的图像追加到EditText控件的最后
            edittext.append(spannableString);
        } catch (Exception e) {
        }
    }

方式二(微信表情中的方式)

注意:
表情的名称设置有一定技巧,可以通过字母+数字的形式设置,比如f0 f1 f2 或者 f00 f01 f02 或者 emo01 emo02 emo03等等,但是有一个规则最好遵守,就是设置成连贯的数字形式,这样是有利于后边的开发的。

1.点击表情,显示在EditText中(需要有表情的id和表情名称)

            //根据图片id获取到drawable资源
            Drawable drawable = getResources().getDrawable(emoId);
            //中括号加上的目的是当用户连续输入表情的时候,可以清晰的将两个表情区分开
            //同时也方便对每个表情进行截取(比如按删除键删除一个表情)
            emoName = "["+emoName+"]";
            //图文混排专用类
            SpannableString ss = new SpannableString(emoName);
            //不设置大小表情无法显示
            drawable.setBounds(0,0,30,30);
            ImageSpan is = new ImageSpan(drawable);
            //SPAN_EXCLUSIVE_EXCLUSIVE 不包括指定内容两边的东西
            ss.setSpan(is,0,emoName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            //获取到光标的位置,确保插入位置追随光标
            int selectionEnd = mEdit.getSelectionEnd();
            Editable finalText = mEdit.getText();
            //追加输入的内容到原有内容上
            if (selectionEnd < finalText.length()){
                finalText.insert(selectionEnd,ss);
            }else{
                finalText.append(ss);
            }
            mEdit.setText(finalText);
            //重新设置焦点位置
            mEdit.setSelection(selectionEnd+ss.length());

2.删除按钮每次删除一个输入内容(包括表情和文字)

//模拟系统删除键
mEdit.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
mEdit.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));

3.图文混排的显示("\[f(.*?)\]" 注意正则表达式的设置跟随表情名称)

        SpannableString ss = new SpannableString(message);
        Pattern pattern = Pattern.compile("\\[f(.*?)\\]");
        Matcher matcher = pattern.matcher(ss);
        while (matcher.find()){
            String group = matcher.group();//[smiley_00]
            String result = group.substring(1, group.length() - 1);
            int drawableId = context.getResources().getIdentifier(result, "drawable", context.getPackageName());
            if (drawableId != 0){
                Drawable drawable = context.getResources().getDrawable(drawableId);
                drawable.setBounds(0,0,30,30);
                ImageSpan span = new ImageSpan(drawable);
                ss.setSpan(span,matcher.start(),matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        mEdit.setText(ss);

相关文章:

  • 局域网的优点
  • Mybatis传递多个参数
  • 帆软2017百城巡展启动在即,力掀数据化管理之风
  • SQL-25 获取员工其当前的薪水比其manager当前薪水还高的相关信息
  • iOS Framework 单元测试(一)-- XCTests
  • 会话技术
  • java基础-Integer类常用方法介绍
  • linux下的小命令
  • 如何快速成为数据分析师(个人角度)
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 用js来实现那些数据结构09(集合01-集合的实现)
  • Jfianl框架定时器使用配置
  • springmvc controller junit 测试
  • 第七周
  • Android 视频解析MediaExtractor
  • android图片蒙层
  • css的样式优先级
  • Laravel Telescope:优雅的应用调试工具
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Objective-C 中关联引用的概念
  • STAR法则
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue--数据传输
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何利用MongoDB打造TOP榜小程序
  • 删除表内多余的重复数据
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 想写好前端,先练好内功
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(TCP网络编程-服务端)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (剑指Offer)面试题34:丑数
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)Oracle存储过程编写经验和优化措施
  • .dwp和.webpart的区别
  • .NET MVC第五章、模型绑定获取表单数据
  • .net快速开发框架源码分享
  • /run/containerd/containerd.sock connect: connection refused
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [100天算法】-实现 strStr()(day 52)
  • [2010-8-30]
  • [AIGC] Redis基础命令集详细介绍
  • [Android]Android开发入门之HelloWorld
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C++] sqlite3_get_table 的使用
  • [DevOps云实践] 彻底删除AWS云资源