SpannableString 富文本写一个demo

作者: Ad大成 | 来源:发表于2019-10-24 19:36 被阅读0次

效果图


image.png

图片管理类

ublic class UserFaceManager {

    private LinkedHashMap<String, Integer> uMap;
    private static UserFaceManager ufm;
    private UserFaceManager(){
        init();
    }
    public static UserFaceManager getInstance(){
        if (ufm==null){
            ufm=new UserFaceManager();
         }
        return ufm;
    }


    private void init() {
        uMap = new LinkedHashMap<>();
        uMap.put("[show]", R.drawable.boq);
        uMap.put("[manager]", R.drawable.bop);
        uMap.put("[lv15]", R.drawable.fans_badge_with_level_15);
        uMap.put("[lv15v]", R.drawable.fans_badge_with_level_15v);
        uMap.put("[lv15vy]", R.drawable.fans_badge_with_level_15vy);
        uMap.put("[lv24]", R.drawable.fans_badge_with_level_24);
        uMap.put("[lv24v]", R.drawable.fans_badge_with_level_24v);
        uMap.put("[lv24vy]", R.drawable.fans_badge_with_level_24vy);
        uMap.put("[lv6]", R.drawable.fans_badge_with_level_6);
        uMap.put("[lv6v]", R.drawable.fans_badge_with_level_6v);
        uMap.put("[lv6vy]", R.drawable.fans_badge_with_level_6vy);

    }
    public int getValue(String key){
        if (uMap.containsKey(key)){
            int value = uMap.get(key);
            return value;
        }
        return -1;

    }

图片居中类

public class CenterAlignImageSpan extends ImageSpan {
    public CenterAlignImageSpan(Drawable d) {
        super(d);
    }

    public CenterAlignImageSpan(Drawable d, int verticalAlignment) {
        super(d, verticalAlignment);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
                     @NonNull Paint paint) {
        Drawable drawable = getDrawable();
        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        //计算y方向的位移
        int translationY = (y + fm.descent + y + fm.ascent) / 2 - drawable.getBounds().bottom / 2;
        canvas.save();
        //绘制图片位移一段距离
        canvas.translate(x, translationY);
        drawable.draw(canvas);
        canvas.restore();
    }
}

spannable工具类


public class SpannableUtils {

    private volatile static SpannableUtils span;
//正则模板 表示任意字符
    private Pattern pattern_img=Pattern.compile("\\[(\\S+?)\\]");
    private Pattern pattern_text=Pattern.compile("(\\S+?)\\:");



    private SpannableUtils(){
//        init();
    }
////    初始化
//    private void init() {
//        sb = new StringBuffer();
//        spannableUtils = SpannableUtils.getInstance();
//
//    }

    public static SpannableUtils getInstance(){
       if (span==null){
           span=new SpannableUtils();
       }
       return span;
    }

    public  SpannableString setupMsgToSpanStr(UserInfo userInfo, TextView tv){
        StringBuffer sb = new StringBuffer();
        UserFaceManager userFaceManager = UserFaceManager.getInstance();


        //获取用户信息
        String msg= userInfo.getMsg();
        String userLv = userInfo.getUserLv();
        int userManager = userInfo.getUserManager();
        String userName = userInfo.getUserName();
        int userShow = userInfo.getUserShow();

        //对信息判断 进行文本拼接
        //如果是爷字辈
        if (userShow==1&&userManager==0){
            sb.append("[show]");
            sb.append("["+userLv+"]");
            sb.append(userName+":");
            sb.append(msg);
            SpannableString spannableString = setupVipUser(sb, userFaceManager, tv);
            return spannableString;

            //如果是管理员
         }else if (userShow==0&&userManager==1){

            sb.append("[manager]");
            sb.append("["+userLv+"]");
            sb.append(userName+":");
            sb.append(msg);
            SpannableString spannableString = setupVipUser(sb, userFaceManager, tv);
            return spannableString;


        //啥也不是
          }else{
            sb.append("["+userLv+"]");
            sb.append(userName+":");
            sb.append(msg);
            SpannableString spannableString = setupNonmemberUser(sb, userFaceManager, tv);
            return  spannableString;
        }


    }
    //会员用户设置
    public SpannableString setupVipUser(StringBuffer sb,UserFaceManager userFaceManager,TextView tv){
        //转拼接好的字符串
        SpannableString spanS = SpannableString.valueOf(sb);
        //正则查找[]
        Matcher matcher = pattern_img.matcher(spanS);
//        int imgClickFlag=0;
        while (matcher.find()){
//            imgClickFlag++;
            String str = matcher.group(0);//第一个找到的[]
            //用规则检测的结果的初始位置和结束位置
            final int start = matcher.start();
            int end = matcher.end();
            if (end -start<10){
                //获取图片管理器中的对应映射图片
                int value = userFaceManager.getValue(str);
                //转换成drawable
                Drawable drawable = MyApp.context.getResources().getDrawable(value);
                //设置图片的边界 左上右下的顺序
                drawable.setBounds(0,0,drawable.getIntrinsicWidth()/2,drawable.getIntrinsicHeight()/2);
                ImageSpan imageSpan = new CenterAlignImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
                spanS.setSpan(imageSpan, start, end, SpannedString.SPAN_INCLUSIVE_INCLUSIVE);
                if (str.contains("show")||str.contains("manager")){


                    spanS.setSpan(new ClickableSpan() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(MyApp.context, VipActivity.class);
                            MyApp.context.startActivity(intent);
                        }
                    }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                }else{
                    spanS.setSpan(new ClickableSpan() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(MyApp.context, VipActivity.class);
                            Toast.makeText(MyApp.context ,"充钱提升等级", Toast.LENGTH_SHORT).show();
                        }
                    }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                }

            }
        }
        //设置字体颜色
        Matcher matcher1 = pattern_text.matcher(spanS);
        while (matcher1.find()){
            int start = matcher1.start();
            int end = matcher1.end();
            ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#CC8287"));
            spanS.setSpan(foregroundColorSpan, start,end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            spanS.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MyApp.context, VipActivity.class);
                    Toast.makeText(MyApp.context, "点击名字", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setUnderlineText(false);

                }
            }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

            tv.setMovementMethod(LinkMovementMethod.getInstance());
            ForegroundColorSpan foregroundColorSpan1 = new ForegroundColorSpan(Color.parseColor("#F42C0D"));
            spanS.setSpan(foregroundColorSpan1, end, spanS.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

        }




        return spanS;
    }
    //非会员用户设置
    public SpannableString setupNonmemberUser(StringBuffer sb,UserFaceManager userFaceManager,TextView tv){
        //转拼接好的字符串
        SpannableString spanS = SpannableString.valueOf(sb);
        //正则查找[]
        Matcher matcher = pattern_img.matcher(spanS);
//        int imgClickFlag=0;
        while (matcher.find()){
//            imgClickFlag++;
            String str = matcher.group(0);//第一个找到的[]
            final int start = matcher.start();
            int end = matcher.end();
            if (end -start<10){
                int value = userFaceManager.getValue(str);
                Drawable drawable = MyApp.context.getResources().getDrawable(value);
                drawable.setBounds(0,0,drawable.getIntrinsicWidth()/2,drawable.getIntrinsicHeight()/2);
                ImageSpan imageSpan = new CenterAlignImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
                spanS.setSpan(imageSpan, start, end, SpannedString.SPAN_INCLUSIVE_INCLUSIVE);
                if (str.contains("show")||str.contains("manager")){


                    spanS.setSpan(new ClickableSpan() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(MyApp.context, VipActivity.class);
                            MyApp.context.startActivity(intent);
                        }
                    }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                }else{
                    spanS.setSpan(new ClickableSpan() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(MyApp.context, VipActivity.class);
                            Toast.makeText(MyApp.context ,"充钱提升等级", Toast.LENGTH_SHORT).show();
                        }
                    }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                }

            }
        }
        //设置字体颜色
        Matcher matcher1 = pattern_text.matcher(spanS);
        while (matcher1.find()){
            int start = matcher1.start();
            int end = matcher1.end();
            ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0F3AEC"));
            spanS.setSpan(foregroundColorSpan, start,end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            spanS.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MyApp.context, VipActivity.class);
                    Toast.makeText(MyApp.context, "点击名字", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    //去掉字体下划线
                    ds.setUnderlineText(false);
                    //设置字体颜色 在设置监听后字体颜色会改变 所以要重新绘制一下
                    ds.setColor(Color.parseColor("#0F3AEC"));
                }
            }, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

            tv.setMovementMethod(LinkMovementMethod.getInstance());
            ForegroundColorSpan foregroundColorSpan1 = new ForegroundColorSpan(Color.parseColor("#0C0C0C"));
            spanS.setSpan(foregroundColorSpan1, end, spanS.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

        }


        return spanS;

    }


}

适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
    private ArrayList<UserInfo> list;
    private Context context;
    private SpannableUtils su;

    public MyAdapter(ArrayList<UserInfo> list, Context context, SpannableUtils su) {
        this.list = list;
        this.context = context;
        this.su = su;
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyHolder(LayoutInflater.from(context).inflate(R.layout.layout_item, parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {
        UserInfo userInfo = list.get(position);
        String userLv = userInfo.getUserLv();//获取用户等级 查看是否是vip
//        String[] lvs = userLv.split("lv");
        String lv = userLv.replace("lv", "");
        if (lv.contains("v")){
            holder.ll.setBackgroundColor(Color.parseColor("#FCE3E1"));
         }
        SpannableString spannableString = su.setupMsgToSpanStr(userInfo,holder.tv);
        holder.tv.setText(spannableString);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyHolder extends RecyclerView.ViewHolder{
        TextView tv;
        LinearLayout ll;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            tv=itemView.findViewById(R.id.tv_spannable);
            ll=itemView.findViewById(R.id.ll);
        }
    }

}

主界面

public class MainActivity extends AppCompatActivity {
        private SpannableUtils spanU;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        RecyclerView recyc = findViewById(R.id.recyc);
        spanU=SpannableUtils.getInstance();
        ArrayList<UserInfo> list = new ArrayList<>();
        list.add(new UserInfo("lv24v","我五哥全网第一",1,0,"狠人"));
        list.add(new UserInfo("lv6","我五哥全网第一",0,0,"暴走大侠华山求带"));
        list.add(new UserInfo("lv15vy","我五哥全网第一",0,1,"锦衣卫来个30万战斗力会走位的开车了"));
        recyc.setLayoutManager(new LinearLayoutManager(this));
        MyAdapter myAdapter = new MyAdapter(list, this, spanU);
        recyc.setAdapter(myAdapter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(spanU!=null){
            spanU=null;
        }

    }
}

自定bean类

public class UserInfo {
//    private String uid;//用户id
    private String userLv;//用户等级 lv+number+v+y  nubmer等级 v是否是vip  y是否是年会员
//    private String userVip;//用户是否是vip 以及是否是年会员
    private String userName;//用户名字
    private int userShow;//用户特殊标识0代表没有 1代表有
    private int userManager;//是否是管理员0代表不是 1代表是
    private String msg;

    public UserInfo( String userLv,  String userName, int userShow, int userManager, String msg) {
//        this.uid = uid;
        this.userLv = userLv;

        this.userName = userName;
        this.userShow = userShow;
        this.userManager = userManager;
        this.msg = msg;
    }



    public String getUserLv() {
        return userLv;
    }

    public void setUserLv(String userLv) {
        this.userLv = userLv;
    }



    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserShow() {
        return userShow;
    }

    public void setUserShow(int userShow) {
        this.userShow = userShow;
    }

    public int getUserManager() {
        return userManager;
    }

    public void setUserManager(int userManager) {
        this.userManager = userManager;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

xml也没什么 就是一个recyclerView 条目一个textview

相关文章

网友评论

    本文标题:SpannableString 富文本写一个demo

    本文链接:https://www.haomeiwen.com/subject/ypidvctx.html