• 正則表達式,推断一串字符串里面包括一定的形式,并解析成图片


    这个事写qq表情的时候用到的,单独拿出来讲讲。

    首先图片0到106张放在res里面,命名为F000到F106 如图

    此时在程序里面定义一个方法

    public void setData(String msg){
    String str = msg; //消息详细内容
    String zhengze = "f0[0-9]{2}|f10[0-7]"; //正則表達式。用来推断消息内是否有表情
    try {
    SpannableString spannableString = ExpressionUtil.getExpressionString(context, str, zhengze);
    content.setText(spannableString);
    } catch (Exception e) {
    e.printStackTrace();

    }

    ExpressionUtil的类是这种

    public class ExpressionUtil {
    /**
    * 对spanableString进行正则推断。假设符合要求,则以表情图片取代
    */
        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);
                    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;
        }


    通过这个推断设置。就能够把字符串中带F000的一些字符串转换我图片qq表情。


  • 相关阅读:
    [C#]获取指定文件文件名、后缀、所在目录等
    Mysql 存储引擎中InnoDB与Myisam的主要区别
    MySQL的btree索引和hash索引的区别
    Mysql事务的隔离级别
    AE序列号
    mysql索引类型说明
    去除url中自带的jsessionid
    redirect传值非url(springmvc3)
    ueditor的使用
    mysql用户管理(开户、权限)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5076164.html
Copyright © 2020-2023  润新知