1. 程式人生 > >android實現表情輸入(極其簡潔易懂)

android實現表情輸入(極其簡潔易懂)

效果:
emoji

只要把emoji圖片換成你自己的資源圖片就可以使用了,程式碼很簡潔。
圖片解析類:

public class EmojiUtil {
    /**
     * 對spanableString進行正則判斷,如果符合要求,則以表情圖片代替
     * @param context
     * @param spannableString
     * @param patten
     * @param start
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws
NumberFormatException * @throws IllegalArgumentException * @throws IllegalAccessException */
public static void dealExpression(Context context,SpannableString spannableString, Pattern patten, int start) throws SecurityException, NoSuchFieldException, NumberFormatException, IllegalArgumentException, IllegalAccessException { Matcher matcher = patten.matcher(spannableString); while
(matcher.find()) { String key = matcher.group(); if (matcher.start() < start) { continue; } Field field = R.drawable.class.getDeclaredField(key); int resId = Integer.parseInt(field.get(null).toString()); //通過上面匹配得到的字串來生成圖片資源id
if (resId != 0) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId); bitmap = Bitmap.createScaledBitmap(bitmap, 60, 60, false);//設定表情大小 ImageSpan imageSpan = new ImageSpan(bitmap); //通過圖片資源id來得到bitmap,用一個ImageSpan來包裝 int end = matcher.start() + key.length(); //計算該圖片名字的長度,也就是要替換的字串的長度 spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //將該圖片替換字串中規定的位置中 if (end < spannableString.length()) { //如果整個字串還未驗證完,則繼續。。 dealExpression(context,spannableString, patten, end); } break; } } } /** * 得到一個SpanableString物件,通過傳入的字串,並進行正則判斷 * @param context * @param str * @return */ public static SpannableString getExpressionString(Context context,String str,String zhengze){ SpannableString spannableString = new SpannableString(str); Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE); //通過傳入的正則表示式來生成一個pattern try { dealExpression(context,spannableString, sinaPatten, 0); } catch (Exception e) { Log.e("dealExpression", e.getMessage()); } return spannableString; } }

解決表情框和軟鍵盤衝突的問題:(demo中沒有寫)

        imgEmoji.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (gridView.getVisibility() == View.VISIBLE) {//如果表情框可見
                    gridView.setVisibility(View.GONE);//隱藏
                    //設定軟鍵盤可以頂出佈局
                    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
                } else {//如果表情框隱藏
                    gridView.setVisibility(View.VISIBLE);//可見
                    //隱藏軟鍵盤,同時社會軟鍵盤為遮擋模式
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
                    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
                }
            }
        });