qq表情实现之二

上篇说道已经实现了点击qq表情,EditText上就能显示qq表情图标偷笑,而不是表情的符号。

但是没有这样的功能,输入比如说88的表情的代号;88,然后就出现再见。项目里面老大实现了这个功能,我也就拿出来分享一下。

这样的话,就必须自己实现TextWatcher这个接口,让EditText注册监听器,监听用户输入的字符是否是表情的代号,如果是则显示表情吐舌头,如果不是就让他显示文字就ok

这里面就必须实现怎样判断表情代号的算法。(这个就不能分享了,因为不是我设计的)

我就TextWatcher和GridView的实现好了

ChatEmotion上篇就已经解释了,这里就不多废口舌了

mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                int currentPos = mEditView.getSelectionStart();
                mEditView.getText().insert(currentPos, ChatEmotion.EMO_SYMBOLS[position]);
//                SpannableStringBuilder ssb = new SpannableStringBuilder();
//                ssb.append(getImageSpannableString(position));
//                mEditView.getText().insert(currentPos, SpannableString.valueOf(ssb));
                mEditView.invalidate();
            }
            
        });

TextWatcher 监听器:

class Watcher implements TextWatcher{
        // isChanged 标志位 防止setText造成StackOverflowError
        private boolean isChanged = false;
        int len ,st = 0;
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            if(isChanged){
                
                return ;
            }
            len = s.length();
            int focusStart = mEditView.getSelectionStart();
            int focusEnd = mEditView.getSelectionEnd();
//            Log.d(TAG, "focus start:"+focusStart);
//            Log.d(TAG, "focus end:"+focusEnd);
//            Log.d(TAG, "len:"+len);
            st = focusStart >= focusEnd ? focusStart : focusEnd;
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            if(isChanged){
                
                return ;
            }
            if(len > s.length()){
                
                return ;
            }
            String str = s.toString();
            SpannableString ss = ChatEmotion.string2Symbol(SmileActivity.this, str);
            Log.d(TAG, ss.toString());
            isChanged = true;
            mEditView.setText(ss);
            isChanged = false;
            mEditView.invalidate();
            Log.d(TAG, "start:"+st);
            Log.d(TAG, "len:"+len);
            Log.d(TAG, "length:"+s.length());
            //光标定位,setText只会让光标放在0位置
            mEditView.setSelection(s.length()-len+st);
        }
        
    }

ChatEmotion.string2Symbol(SmileActivity.this, str);这个函数封装了算法设计,我就不分享了,提示一下:就是把输入的字符串转成字符数组,然后使用循环,一个个比较表情代号字符,有点类似字符匹配。呵呵,就此为止吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值