热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidEditText表情输入的探索

简述自己封装一个EditText(实际上只是在EditText内部添加了一个TextWatcher),监听文本改变,将其中

简述

自己封装一个EditText(实际上只是在EditText内部添加了一个TextWatcher),监听文本改变,将其中的“[..]”类型的文本替换为表情

先说一下在编写中遇到的一个问题:

Drawable drawable = getResources().getDrawable(p1, null);
ImageSpan span = new ImageSpan(drawable, DynamicDrawableSpan.ALIGN_BASELINE);
s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

这里获取出来的ImageSpan是显示不出来的!

使用这个方法时,必须设置drawable的边界:

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());

或者使用ImageSpan的另一个构造方法:

ImageSpan span = new ImageSpan(getContext(), R.drawable.p1, DynamicDrawableSpan.ALIGN_BASELINE);

项目

image

(效果图)

package com.momingqi.wedget;import android.content.Context;
import android.text.Editable;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;import com.momingqi.R;import java.util.regex.Matcher;
import java.util.regex.Pattern;import static android.content.ContentValues.TAG;/*** 可输入表情的输入框控件* @author mingC* @date 2018/4/2*/
public class ExpressionEditText extends android.support.v7.widget.AppCompatEditText{/*** 当前输入框是否是表情结尾*/private boolean isEmojiEnd &#61; false;public ExpressionEditText(Context context) {super(context);}public ExpressionEditText(Context context, AttributeSet attrs) {super(context, attrs);init(context, attrs);}&#64;Overridepublic void setText(CharSequence text, BufferType type) {super.setText(text, type);}/*** 删除一个字符或删除一个表情*/public void deleteOne() {Editable editable &#61; this.getText();int len &#61; editable.length();if (len <1) {return;}if (isEmojiEnd) {//删除一块editable.delete(len-4, len);} else {editable.delete(len-1, len);}}/*** 初始化* &#64;param context* &#64;param attrs*/private void init(Context context, AttributeSet attrs) {addTextChangedListener(new TextWatcher() {int type &#61; 0; //0->append,1->delete&#64;Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {if (after > count) {type &#61; 0;Log.d("ExpressionEditText", "增加字符");} else {type &#61; 1;Log.d("ExpressionEditText", "删减字符");}Log.d(TAG, "beforeTextChanged: strat&#61;" &#43; start &#43; ",count&#61;" &#43; count &#43; " ,after&#61;" &#43; after);}&#64;Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}&#64;Overridepublic void afterTextChanged(Editable s) {//初始化标志isEmojiEnd &#61; false;String regex &#61; "\\[(.*?)\\]";Pattern pattern &#61; Pattern.compile(regex);Matcher matcher &#61; pattern.matcher(s.toString());while (matcher.find()) {int start &#61; matcher.start();int end &#61; matcher.end();if (end &#61;&#61; s.length()) {isEmojiEnd &#61; true;}Log.d("匹配结果", matcher.group(0) &#43; "," &#43; matcher.group(1));String id &#61; matcher.group(1);int drawableId &#61; R.drawable.p1;switch (id) {case "p1":drawableId &#61; R.drawable.p1;break;case "p2":drawableId &#61; R.drawable.p2;break;case "p3":drawableId &#61; R.drawable.p3;break;}ImageSpan span &#61; new ImageSpan(getContext(), drawableId, DynamicDrawableSpan.ALIGN_BASELINE);s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}}});}
}

项目问题&#xff1a;由于每一次TextChange都需要使用正则来搜索一遍输入的字符串&#xff0c;将其中[]格式的字符转为表情&#xff0c;这样导致的问题就是用户无法快速删除输入表情&#xff0c;用户体验非常不好&#xff01;


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
丶原色调
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有