Android中TextView的富文本显示

有时候我们需要在Android的TextView中简单显示一些更多的功能,比如超链接啊,小图片啊什么的,查了下资料,简单写个小Demo做个备份

以下是部分代码,第一部分是在Activity中,


private void setTextView1() {

        String text = "TextView显示html文本:

粗体"
                + "百度链接"
                + "红色";
        textView.setText(Html.fromHtml(text));
        // 支持网页超链接点击
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    private void setTextView2() {
        String text = "电话: 020-5555555 "
                + "网站:http://www.weibo.com "
                + "微博提到某用户: @红茶36   "
                + "微博讨论的主题 : #Android面试宝典# #java宝典# 邮箱:956***[email protected]";
        textView2.setText(text);
        // 识别超链接:电话,网页
        // Linkify:它会使用正则表达匹配相应的超链接,如果匹配成功,就会识别为超链接
        // 点击超链接后,会执行: startActivity(new Intent(Intent.ACTION_VIEW, uri))
        // 电话uri: tel://xx
        // 网页uri: http://xx
        Linkify.addLinks(textView2, Linkify.PHONE_NUMBERS | Linkify.WEB_URLS);
        // 添加自定义超链接
        LinkifyUtil.addCustomLinks(textView2);
    }

    private void setTextView3() {
        String text = "高兴[高兴]--TextView实现图文混排功能";
        
//        SpannableString ss = new SpannableString(text);
//        ImageSpan span = new ImageSpan(this, R.drawable.ic_launcher);
//        ss.setSpan(span, 2, 6, 0);
//        textView3.setText(ss);
        
        
        SpannableString ss = new SpannableString(text);
        Bitmap bitmap = createFixSizeBitmap(this, R.drawable.ic_launcher, dp2px(20));
        ImageSpan span = new ImageSpan(this, bitmap, ImageSpan.ALIGN_BOTTOM);
        ss.setSpan(span, 2, 6, 0);
        textView3.setText(ss);
    }

    private int dp2px(float dp) {
        return (int) (getResources().getDisplayMetrics().density * dp + 0.5f);
    }

    /**
     * 创建指定大小的Bitmap对象
     * @param textViewActivity
     * @param icLauncher
     * @param imageWidth 要生成的bitmap对象的宽度(高度)
     * @return
     */
    private Bitmap createFixSizeBitmap(Context context, int imageResId, int imageWidth) {
        // 原始图片
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imageResId);
        int rawWidth = bitmap.getWidth(); // 原始图片的宽度
        int rawHeight = bitmap.getHeight();// 原始图片的高度
        
        float scaleW = (float)imageWidth / rawWidth;
        float scaleH = (float)imageWidth / rawHeight;
        
        Matrix matrix = new Matrix();
        matrix.postScale(scaleW, scaleH);
        
        return Bitmap.createBitmap(bitmap, 0, 0, rawWidth, rawHeight, matrix, true); // 传false图片会失真

    }

*******************

下面传一下 部分LinkifyUtil 的代码

/**
     * 识别主题超链接: #xxx#
     * @param textView
     */
    public static void addTopicLinks(TextView textView) {
        // 匹配形如  #xxx#  的正则表达式
        // \u4E00-\u9FA5所有的中文字符
        Pattern p = Pattern.compile("#([A-Za-z0-9\u4E00-\u9FA5]+)#");
        String scheme = "weibo://topic?uid=";
        // 匹配的过滤器
        MatchFilter matchFilter =  null;
        // 用来处理返回的结果
        TransformFilter transformFilter = new TransformFilter() {
            
            @Override
            public String transformUrl(Matcher match, String url) {
                String str = match.group(0);
                String str2 = match.group(1);
                System.out.println("----------str : " + str + "  str2 : " + str2);
                return str2;
            }
        };
        Linkify.addLinks(textView, p, scheme, matchFilter, transformFilter);
    }

/**
     * 识别用户超链接: @xxx
     * @param textView
     */
    public static void addUserLink(TextView textView) {
        // 匹配形如  @xxx  的正则表达式
        // \u4E00-\u9FA5所有的中文字符
        Pattern p = Pattern.compile("\\@([A-Za-z0-9\u4E00-\u9FA5]+)\\.?");
        String scheme = "weibo://user?uid=";
        // 匹配的过滤器
        MatchFilter matchFilter =  new MatchFilter() {
            
            @Override // 是否接受匹配的结果,返回true表示接受匹配,则会显示成超链接
            public boolean acceptMatch(CharSequence s, int start, int end) {
                // 获取匹配到的字符串
                String bean = s.subSequence(start, end).toString();
                System.out.println("------------bean: " + bean);
                
                if (bean.endsWith(".")) { // 邮箱
                    return false;
                } else {
                    return true;
                }
            }
        };
        // 用来处理返回的结果
        TransformFilter transformFilter = new TransformFilter() {
            
            @Override
            public String transformUrl(Matcher match, String url) {
                String str = match.group(0);
                String str2 = match.group(1);
                System.out.println("----------str : " + str + "  str2 : " + str2);
                return str2;
            }
        };
        Linkify.addLinks(textView, p, scheme, matchFilter, transformFilter);
    }

****************

运行如下图:

Android中TextView的富文本显示_第1张图片


你可能感兴趣的:(随笔)