表情为本地表情,把所有的表情图片装载到gridview里面。然后在gridview的点击事件里做如下处理。
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) { if(mEditText == null) return; String content = mEditText.getText().toString().trim() + emotionNames[index]; if(TextUtils.isEmpty(content)) return; Log.d(TAG, "SinaEmotionView: content = " + content); boolean isLeft = true; //应该出现哪一边的括号 List<Integer> leftBracketAt = new ArrayList<Integer>(); List<Integer> rightBracketAt = new ArrayList<Integer>(); char[] c_content = content.toCharArray(); for(int i = 0; i < c_content.length; i++){ if('[' == c_content[i]){ // Log.d(TAG, "left ------- " + i); if(!isLeft){ //如果不该出现左括号时,出现了。则覆盖上一个。 leftBracketAt.remove(leftBracketAt.size() - 1); } leftBracketAt.add(new Integer(i)); isLeft = false; }else if(']' == c_content[i]){ // Log.d(TAG, "right ------- " + i); if(isLeft){ rightBracketAt.remove(leftBracketAt.size() - 1); } rightBracketAt.add(new Integer(i)); isLeft = true; } } SpannableString spannable = new SpannableString(content); //获得左右[]位置链表长度小的链表的长度//因为用户也有可能输入"[" 或者 "]" int miniSize = leftBracketAt.size() <= rightBracketAt.size() ? leftBracketAt.size() : rightBracketAt.size(); for(int j = 0; j < miniSize; j++){ int leftAt = leftBracketAt.get(j); int rightAt = rightBracketAt.get(j) + 1; while(leftAt >= rightAt){ rightBracketAt.remove(j); rightAt = rightBracketAt.get(j); // Log.d(TAG, "while ---- "); } String name = content.substring(leftAt, rightAt); // Log.d(TAG, "name ---- " + name + "."); //查询name是不是表情的name int pos = emotionNamePos(name); if(-1 != pos){ //把文字替换成图片来显示 Drawable drawable = getResources().getDrawable(emotionIconIds[pos]); drawable.setBounds(0, 10, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()+10); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannable.setSpan(span, leftAt, rightAt, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } } mEditText.setText(spannable); //设置光标位置到最后 mEditText.requestFocus(); mEditText.setSelection(content.length()); }
其中,
mEditText是要显示表情及微博文本内容的EditText控件
emotionIconIds是表情图片id的int型数组
emotionNames是表情对应的文字(如,"[哈哈]")的一个字符串数组
/** * 查询一个字符串是不是一个表情的名字, * 如果是,则返回位置,如果不是则返回-1; * @param name * @return */ private int emotionNamePos(String name){ if(name == null) return -1; for(int i = 0; i < emotionNames.length; i++){ if(name.equals(emotionNames[i])) return i; } return -1; }