android sina 微博表情功能的實現
阿新 • • 發佈:2019-02-17
表情為本地表情,把所有的表情圖片裝載到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; }