运用spinner和正则表达式pattern来实现文字中表情文字的替换

第一步:在string中写入array表情文字

第二部:编写util类实现

用于解析字段中的表情文字,然后用图片替换,运用Hasmap来实现存储,键用来表示表情文字,值用来表示图片id

第三部:在activity类中,抓取表情文字,然后用图片替换


以下为源代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="emotions">
        <item>[爱你]</item>
        <item>[花心]</item>
        <item>[抓狂]</item>
    </string-array>
</resources>


activity类:

package app.coolweather.com.weibo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import Util.EmotionsParse;

/**
 * Created by Administrator on 2016/8/27.
 */
public class AtActivity extends Activity {

     EmotionsParse emotionsParse;
    private ProgressDialog progressDialog;
    private TextView textView;
    private static String START="start";
    private static String END="end";
    private static String PHRASE="phrase";
    private String str="#《爱够了没》第二季开播了# 麻辣的话题看够没?[爱你][花心][抓狂]强大的美女观察团看够了没?@陈汉典 回归,@HOLD住姊LINLIN 爆笑加盟,《#爱够了没#》第二季播出了!五位帅哥一一登台亮相,Hold住姐现场征婚,不知道Hold住姐青睐哪一个呢? http://t.cn/ShSRRN ";


    private static final String TOPIC="#.+?#";
    private static final String NAME="@([\u4e00-\u9fa5A-Za-z0-9_]*)";
    private static final String URL="http://.*";
    private static final String EMOTION="\\[[\u4E00-\u9FA5a-zA-Z0-9]*\\]";

    private SpannableString spannableString = new SpannableString(str);


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.at_layout);
        showDialg();
        progressDialog.dismiss();
        textView=(TextView)findViewById(R.id.at_text_view);
        hightLight(Pattern.compile(TOPIC));
        hightLight(Pattern.compile(NAME));
        hightLight(Pattern.compile(URL));
        phrase(Pattern.compile(EMOTION));

       //设置spannableString
        textView.setText(spannableString);


    }

    /**
     * 对查找到的文字进行图片转换
     */
    public void phrase(Pattern pattern){

        List<HashMap<String, String>> lst  = this.getStartAndEnd(pattern);  //获取查找到的文字字段
        for (HashMap<String, String> map : lst)                 //遍历里面得文字,改变其的属性
        {
     //         Drawable drawable=this.getResources().getDrawable(R.drawable.crazy);
            Drawable drawable=emotionsParse.getDrawableByMyself(map.get( PHRASE));              //这句话为空
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            ImageSpan imageSpan=new ImageSpan(drawable);
            spannableString.setSpan(imageSpan, Integer.parseInt(map.get(START)), Integer.parseInt(map.get(END)), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//具体百度
        }


    }

    /**
     * 对查找到的文字进行调高调亮
     * @param pattern
     */
    public void hightLight(Pattern pattern)
    {

        List<HashMap<String, String>> lst  = this.getStartAndEnd(pattern);  //获取查找到的文字字段


        for (HashMap<String, String> map : lst)                 //遍历里面得文字,改变其的属性
        {
            //spinnableString就是修改文本的属性
          //   SpannableString spannableString = new SpannableString(str);
            ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);        //设置颜色
            spannableString.setSpan(span, Integer.parseInt(map.get(START)), Integer.parseInt(map.get(END)), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//具体百度
        }


    }

    /**
     * 用正则表达式匹配字段是否含有需要的文字,有的话就放入list中
     * @param pattern
     * @return
     */
    public List<HashMap<String, String>> getStartAndEnd(Pattern pattern)
    {
        List<HashMap<String, String>> lst = new ArrayList<HashMap<String,String>>();
        Matcher matcher = pattern.matcher(str);                   //在str中查找pattern的字段,用正则表达式匹配在文本中是否有查找的字段,如果有就讲其存储在list中
        while(matcher.find())
        {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put(PHRASE, matcher.group());                    //将抓取到的值保存在group当中
            map.put(START, matcher.start()+"");                  // start函数返回匹配到的子字符串的开始位置,没有匹配到的话,应该是-1,小于0
            map.put(END, matcher.end()+"");                      //group是用来存放正则表达式的匹配结果的,就是一个变量,其中的内容是匹配结果
            lst.add(map);
        }
        return lst;
    }






    private void showDialg()
    {

        if(null == progressDialog)
        {
            progressDialog = new ProgressDialog(this);
        }
        progressDialog.setMessage("正在登录...");
        progressDialog.show();
    }
}


util类:

package Util;

import android.content.Context;
import android.graphics.drawable.Drawable;
import java.util.HashMap;
import app.coolweather.com.weibo.R;

/**用于解析字段中的表情文字,然后用图片替换,运用Hasmap来实现存储,键用来表示表情文字,值用来表示图片id
 * Created by Administrator on 2016/9/26.
 */
public class EmotionsParse {
    private Context context;
    private static  String[] phrases;
    private static int[] emotions_id={
            R.drawable.love,
            R.drawable.hx,
            R.drawable.crazy
    };
    private static HashMap<String,Integer>  hashMap = new HashMap<String,Integer>();

    /**
     *构造函数将两个数据保存到hasap中
     */
    public EmotionsParse(Context context) {
        this.context = context;
        phrases = context.getResources().getStringArray(R.array.emotions);             //获取strings中的文字
        if (phrases.length != emotions_id.length)
            throw new RuntimeException("图片文字大小不符合");
        int length = emotions_id.length;

        for (int i = 0; i < length; i++) {
            hashMap.put(phrases[i], emotions_id[i]);
        }
    }

    /**
     *根据键从haspmap中读取数据,然后设置drawable
     */
     public Drawable getDrawableByMyself(String phrase){


             return context.getResources().getDrawable(hashMap.get(phrase));


     }


}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值