1. 程式人生 > >android sina 微博表情功能的實現

android sina 微博表情功能的實現

表情為本地表情,把所有的表情圖片裝載到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;
	}