Android使用TextView实现图文混排

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014619545/article/details/81262175

方式一:

使用Html.fromHtml(html, urlImageParser, null)方法

代码:

URLImageParser urlImageParser = new URLImageParser(mContext, tvContent);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // flags
            // FROM_HTML_MODE_COMPACT:html块元素之间使用一个换行符分隔
            // FROM_HTML_MODE_LEGACY:html块元素之间使用两个换行符分隔
            tvContent.setText(
                    Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT, urlImageParser, null));
        } else {
            tvContent.setText(Html.fromHtml(html, urlImageParser, null));
        }
//类是copy的
public class URLImageParser implements Html.ImageGetter {
    private Context context;
    private TextView tvContent;
    private int actX;//实际的宽  放大缩小基于textview的宽度
    private int actY;

    public URLImageParser(Context context, TextView tvContent) {
        this.context = context;
        this.tvContent = tvContent;
        //获取全屏大小
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        //我的textview有左右留边  margin
        actX = metrics.widthPixels - 20;
        actY = metrics.heightPixels;
    }

    @Override
    public Drawable getDrawable(String source) {
        final URLDrawable urlDrawable = new URLDrawable();
        Glide.with(context).load(source).into(new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
                BitmapDrawable bmd = (BitmapDrawable) resource;
                Bitmap bitmap = bmd.getBitmap();
                int x = bitmap.getWidth();
                int y = bitmap.getHeight();
                if (x > actX || y > actY) {
                    //进行等比例缩放程序
                    Matrix matrix = new Matrix();
                    matrix.postScale((float) (actX * 1.00 / x), (float) (actX * 1.00 / x));
                    //长和宽放大缩小的比例
                    bitmap = Bitmap.createBitmap(bitmap, 0, 0, x, y, matrix, true);
                }
                urlDrawable.bitmap = bitmap;
                urlDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
                tvContent.invalidate();
                tvContent.setText(tvContent.getText()); // 解决图文重叠
            }
        });
        return urlDrawable;
    }

    public class URLDrawable extends BitmapDrawable {
        protected Bitmap bitmap;

        @Override
        public void draw(Canvas canvas) {
            if (bitmap != null) {
                canvas.drawBitmap(bitmap, 0, 0, getPaint());
            }
        }
    }
}

方法二:

使用WebView来显示:

        //webview的通用设置       
        WebSettings webSettings = tvContent.getSettings();
        webSettings.setDefaultTextEncodingName("utf-8");
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        webSettings.setJavaScriptEnabled(true);//支持js
        webSettings.setDomStorageEnabled(true);
        //去掉网页的滚动条
        tvContent.setHorizontalScrollBarEnabled(false);//水平不显示
        tvContent.setVerticalScrollBarEnabled(false); //垂直不显示

        tvContent.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        //设置加载动画
        tvContent.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                if (newProgress >= 99) {
                    umi.dismissLoading();
                } else {
                    umi.showLoading();
                }
            }
        });
        //Jsoup 引入的处理jar包,可以针对某些类型来设置其属性
        Document parse = Jsoup.parse(html);
        Elements imgs = parse.getElementsByTag("img");
        Elements videos = parse.getElementsByTag("video");
        
        //设置图片 的宽度为100% 高度为自动
        if (!imgs.isEmpty()) {
            for (Element e : imgs) {
                imgs.attr("width", "100%");
                imgs.attr("height", "auto");
            }
        }
        //设置视频 的宽度为100% 高度为自动
        if (!videos.isEmpty()) {
            for (Element e : videos) {
                videos.attr("width", "100%");
                videos.attr("height", "auto");
            }
        }

        String content = parse.toString();
        tvContent.loadDataWithBaseURL(null, content, "text/html", "utf-8", null);

使用上述webview方式,要下载jsoup的jar包:jsoup-1.8.1.jar

对比上面的两种方法,感觉webview的展示要更加完美,推荐使用webView方式。

猜你喜欢

转载自blog.csdn.net/u014619545/article/details/81262175