二十二、图文混合排版

太过爱你忘了你带给我的痛 2022-07-17 03:21 299阅读 0赞

我们在APP上看的帖子,有文字又有图片,经过我个人分析,应该就是通过图文混合排版实现的,主要用到的类就是SpannableStringBuilder。

在帖子中显示的图片,保存在服务器时,就是一个链接地址,为了便于我们在文章中把图片链接地址找出来,我们规定图片链接的格式是:{image=链接地址},这样我们就可以通过正则表达式找出图片链接和图片的位置,然后替换成图片插入到文章中。

一、使用正则表达式

  1. String pattern = "\\{image=.*?\\}"; // 最小匹配
  2. Pattern r = Pattern.compile(pattern);
  3. Matcher m = r.matcher(postInfo.content);
  4. while(m.find()) {
  5. final String url = m.group();
  6. /*
  7. 其他逻辑
  8. */
  9. }

一开始我的正则表达式是:

  1. {image=.*?}

一直测试都通不过,不能获取到正常的字符串,后来经过群里的热心网友指点,才发现需要对中括号做转义,因为中括号在正则表达式里有特殊含义,加了两个反斜杠解决问题。

二、链接替换成图片

先把代码贴出:

  1. SpannableStringBuilder ssb = new SpannableStringBuilder(postInfo.content);
  2. String pattern = "\\{image=.*?\\}";
  3. Pattern r = Pattern.compile(pattern);
  4. Matcher m = r.matcher(postInfo.content);
  5. while(m.find()) {
  6. final String url = m.group(); // ---------------1
  7. final String urlFinal = getImageUrl(url); // ---------------2
  8. ssb.setSpan(new DynamicDrawableSpan() {
  9. @Override
  10. public Drawable getDrawable() {
  11. final UrlDrawable drawable = new UrlDrawable(); // ---------------3
  12. ImageLoader.getInstance().loadImage(urlFinal, new SimpleImageLoadingListener() {
  13. @Override
  14. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  15. drawable.bitmap = loadedImage; // ---------------4
  16. drawable.setBounds(0, 0, loadedImage.getWidth(), loadedImage.getHeight());
  17. textView.invalidate();
  18. textView.setText(textView.getText());
  19. }
  20. });
  21. return drawable;
  22. }
  23. }, m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  24. }
  25. textView.setText(ssb);

在1处,利用正则表达式获取到链接

  1. {image=http://img2.imgtn.bdimg.com/it/u=3883416401,3783004807&fm=21&gp=0.jpg}

再在2处自己写的方法拿出图片链接

  1. http://img2.imgtn.bdimg.com/it/u=3883416401,3783004807&fm=21&gp=0.jpg

在3的地方是我们自定义的一个类:

  1. public class UrlDrawable extends BitmapDrawable {
  2. Bitmap bitmap;
  3. @Override
  4. public void draw(Canvas canvas) {
  5. if(bitmap != null){
  6. canvas.drawBitmap(bitmap, 0, 0, getPaint());
  7. }
  8. }
  9. }

当从网络获取到图片后,重绘图片。

然后利用ImageLoader异步从网络获取图片。4的地方获取到图片后,刷新图片出来。

文章内容是:

  1. 是公司公司的发货多喝点大会堂的很简单dsfgs多喝点大会堂的很简单dsfgs多喝点大会堂的很简单dsfgs多喝点大会堂的很简单dsfgs多喝点大会堂的很简单dsfgs高东方风格和发动机45641515回家过{image=http://img2.imgtn.bdimg.com/it/u=3883416401,3783004807&fm=21&gp=0.jpg}跟对方回复或第三个是公司的股东会的双击回到电话电话单双色入获得获得

效果图:

Center

问题:当图片很多时,加载会出现问题。

参考:

https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Quick-Setup

http://www.jianshu.com/p/3a5b18c7861a

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读

    相关 中西文混合排版指南

    前言 不知道各位读者有没有这种感受:虽然某篇文章内容是干货,但是时不时的字体不统一、花花绿绿的颜色、忽然冒出来的表情包很大程度上影响了自己的阅读体验。 让我们一起按照此

    相关 处事

    1.看穿但不说穿。很多事情,只要自己心里有数就好了,没必要说出来。 2.高兴,就笑,让大家都知道。悲伤,就假装什么也没发生 3.在不违背原则的情况下 ,对别人要宽容 ,能帮