code: private static void dealExpression(Context context, SpannableString spannableString, Pattern patten, int start, boolean adjustEmoji)
              throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
          Matcher matcher = patten.matcher(spannableString);
          while (matcher.find()) {
              String key = matcher.group();
              if (matcher.start() < start) {
                  continue;
              }
              // 通过上面匹配得到的字符串来生成图片资源id
              EmojiItem item = getEmojiItem(key);
              if (null != item) {
                  // 计算该图片名字的长度，也就是要替换的字符串的长度
                  int end = matcher.start() + key.length();
                  // 通过图片资源id来得到图像，用一个ImageSpan来包装
                  // 设置图片的大小为系统默认文字大小，以便文字图片对齐
                  Drawable drawable = context.getResources().getDrawable(item.getResId());
                  if (adjustEmoji && emojiSize > 0) {
                      drawable.setBounds(0, 0, emojiSize, emojiSize);
                  } else {
                      // 不缩放时用默认的宽高
                      drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                  }
                  CenteredImageSpan imageSpan = new CenteredImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
                  // 将该图片替换字符串中规定的位置中
                  spannableString.setSpan(imageSpan, matcher.start(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                  if (end < spannableString.length()) {
                      // 如果整个字符串还未验证完，则继续递归查询替换。。
                      dealExpression(context, spannableString, patten, end, adjustEmoji);
                  }
                  break;
              }
          }
      }
docs: 对spanableString进行正则判断，如果符合要求，则以表情图片代替
  
  @param context         context
  @param spannableString htmlstring
  @param patten          patten
  @param start           start index
  @param adjustEmoji     是否缩放表情图
  @throws SecurityException
  @throws NoSuchFieldException
  @throws NumberFormatException
  @throws IllegalArgumentException
  @throws IllegalAccessException