美文网首页
EditText(插入表情图片)

EditText(插入表情图片)

作者: 任振铭 | 来源:发表于2018-04-16 12:52 被阅读22次

    (创建于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);
    

    相关文章

      网友评论

          本文标题:EditText(插入表情图片)

          本文链接:https://www.haomeiwen.com/subject/fhzskftx.html