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);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值