热门标签 | 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;


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • const限定符全解一、const修饰普通变量  intconsta500;  constinta600;  上述两种情况相同,都是声明一个const型的变量,它们 ... [详细]
  • HTC EVO 4G+手机存储(SD卡)中各个文件夹功能说明(转载)
      HTCRider/X515E/EVO4G+手机存储(SD卡)中各个文件夹功能说明  HTCRider/X515E/EVO4G+  1、.android_s ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 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社区 版权所有