Span使用之文字高亮及点击事件

由于工作上的需求,类似于淘宝京东在获取物流信息时电话号码高亮显示,并触摸和点击电话号码时跳转到拨打电话.刚开始一时没想到什么好的方法,最后通过查找资料,看到了Span完全能够实现需求,并且使用效果好的不行.话不多说先上效果图如下:

这里写图片描述

效果图如上,现在分析实现的核心代码如下:

 //初始化SpannableStringBuilder
        mSpannableStringBuilder = new SpannableStringBuilder(mContent);
        //初始化需要高亮显示的文字和对其设置点击事件
        SpannableStringBuilder spannableStringBuilder = initClickText(mSpannableStringBuilder, mContent);
         //把mSpannableStringBuilder设置给对应的文本控件
        mTv.setText(spannableStringBuilder);
 //对文本控件设置触摸事件,当触摸区域是电话号码时拨打电话
        mTv.setOnTouchListener((v, event) -> {
            boolean ret = false;
            CharSequence text = ((TextView) v).getText();
            Spannable stext = Spannable.Factory.getInstance().newSpannable(text);
            TextView widget = (TextView) v;
            int action = event.getAction();
            //根据点击判断是否在spannable对象上;
            if (action == MotionEvent.ACTION_UP
                    || action == MotionEvent.ACTION_DOWN) {
                int x = (int) event.getX();
                int y = (int) event.getY();
                x -= widget.getTotalPaddingLeft();
                y -= widget.getTotalPaddingTop();
                x += widget.getScrollX();
                y += widget.getScrollY();
                Layout layout = widget.getLayout();
                int line = layout.getLineForVertical(y);
                int off = layout.getOffsetForHorizontal(line, x);
                ClickableSpan[] link = stext.getSpans(off, off, ClickableSpan.class);
                if (link.length != 0) {
                    if (action == MotionEvent.ACTION_UP) {
                        link[0].onClick(widget);
                    }
                    ret = true;
                }
            }
            return ret;
        });
 /**
     *  获取文字中的电话号码 并高亮显示和设置点击事件
     * @param spannableStringBuilder
     * @param text 文字内容
     * @return
     */
    private SpannableStringBuilder initClickText(SpannableStringBuilder spannableStringBuilder, String text) {
        Pattern patternPhone = Pattern.compile("\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}");
        Matcher matcherPhone = patternPhone.matcher(text);
        int start = 0;
        //遍历取出字符串中所有的符合条件的;
        while (matcherPhone.find(start)) {
            start = matcherPhone.end();
            spannableStringBuilder.setSpan(new ForegroundColorSpan(CommonUtils.getColor(this, R.color.colorPrimary)), matcherPhone.start(), matcherPhone.end(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            spannableStringBuilder.setSpan(new MyUrlSpan(matcherPhone.group()), matcherPhone.start(),
                    matcherPhone.end(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            if (start >= text.length()) {
                break;
            }
        }
        return spannableStringBuilder;

    }
/**
     * Span点击的实现类
     */
    private class MyUrlSpan extends ClickableSpan {
        private String mUrl;

        public MyUrlSpan(String url) {
            mUrl = url;
        }

        //点击链接下划线,弹出dialog,提示提电话,或者发短信;通用的dialog我上篇文章有介绍.
        @Override
        public void onClick(View widget) {
            CommonBaseDialog.showDialog(SpanActivity.this, R.layout.common_dialog)
                    .setText(R.id.title, getPhoneText(mUrl))
                    .setViewVisibility(R.id.content, View.GONE)
                    .setDialogLocation(Gravity.CENTER, 60, 0, 60, 0)
                    .setViewListener((dialog, viewId) -> {
                        switch (viewId) {
                            case R.id.confirm:
                                Intent intent = new Intent(Intent.ACTION_DIAL);
                                Uri data = Uri.parse("tel:" + mUrl);
                                intent.setData(data);
                                SpanActivity.this.startActivity(intent);
                            case R.id.cancel:
                                dialog.dismiss();
                                break;
                        }
                    }, R.id.cancel, R.id.confirm);


        }
    }

这样就完美的实现了上述的需求希望这篇文章对你有所帮助谢谢!!!!!!!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android平台上的音频文字高亮可以通过使用SpannableString类来实现。SpannableString是一个可以在文本上添加样式和格式的类。 首先,我们需要创建一个SpannableString对象,该对象是用于控制文字的样式和格式的。然后,使用setSpan方法来设置需要高亮文字部分以及对应的样式。 要高亮文字,可以使用ForegroundColorSpan类来设置文字的前景色。例如,可以使用下面的代码将文字的前景色设置为红色: ```java SpannableString spannableString = new SpannableString("这是一段需要高亮文字"); ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.RED); spannableString.setSpan(colorSpan, 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ``` 以上代码中,"这是一段需要高亮文字"这段文字的前8个字符将会被设置为红色。其中,第三个参数0表示要设置样式的文字的起始位置,第四个参数8表示要设置样式的文字的结束位置。最后一个参数Spanned.SPAN_EXCLUSIVE_EXCLUSIVE表示设置的样式只作用于起始和结束位置之间的文字。 除了设置前景色之外,还可以使用其他的样式类来实现不同的高亮效果,比如BackgroundColorSpan来设置文字的背景色,ClickableSpan来设置文字的点效果等等。 最后,将高亮后的SpannableString对象应用到相应的UI控件上,比如TextView,这样高亮文字就会在界面上显示出来。 以上就是使用SpannableString类来实现Android音频文字高亮的一种方式。根据实际需求,还可以结合其他的样式类来实现更多的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值