Android自定义View实现HTML图文环绕效果

Android中并没有提供HTML图文环绕效果的view,最接近的算是TextView中的ImageSpan了,但并未完全实现图文环绕(图文混排)的效果。

在留坝等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站设计 网站设计制作按需网站制作,公司网站建设,企业网站建设,品牌网站设计,营销型网站,外贸营销网站建设,留坝网站建设费用合理。

1、Android系统TextView的ImageSpan实现图文环绕

代码如下:

 
 
 
 
  1. TextView tv = new TextView ( this ) ; 
  2.         
  3. SpannableString spanStr = new SpannableString ( "掌声那历史的房间里是副经理撒旦法阿斯顿及福利费是到发顺丰" ) ; 
  4. ImageSpan imageSpan = new ImageSpan ( this, R. drawable. a ) ; 
  5. spanStr. setSpan (imageSpan, 3, 5, Spannable. SPAN_INCLUSIVE_INCLUSIVE ) ; 
  6. tv. setText (spanStr ) ; 
  7.         
  8. setContentView (tv ) ; 

2、Android中自定义View实现图文环绕

代码如下:

 
 
 
 
  1. FloatImageText view = new FloatImageText ( this ) ; 
  2. view. setText ( "电视里发生了房间里是积分拉萨积分拉萨积分拉萨减肥啦空间  撒旦法发大水发撒旦法看完了鸡肉味容积率为热键礼物i经二路文件容量为积分拉萨解放路口上飞机撒离开房间爱水立方法拉圣诞节福禄寿" ) ; 
  3. Bitmap bm = BitmapFactory. decodeResource (getResources ( ), R. drawable. a ) ; 
  4. view. setImageBitmap (bm, 30, 30 ) ; 
  5.  
  6.   
  7.  
  8.   
  9. package com.orgcent.view ; 
  10.  
  11. import java.util.ArrayList ; 
  12.  
  13. import android.content.Context ; 
  14. import android.graphics.Bitmap ; 
  15. import android.graphics.Canvas ; 
  16. import android.graphics.Color ; 
  17. import android.graphics.Paint ; 
  18. import android.graphics.Rect ; 
  19. import android.graphics.Paint.FontMetrics ; 
  20. import android.util.AttributeSet ; 
  21. import android.util.DisplayMetrics ; 
  22. import android.view.View ; 
  23. /** 
  24. * 模拟CSS中的float浮动效果 
  25. */ 
  26. public class FloatImageText extends View { 
  27.     private Bitmap mBitmap ; 
  28.     private final Rect bitmapFrame = new Rect ( ) ; 
  29.     private final Rect tmp = new Rect ( ) ; 
  30.     private int mTargetDentity = DisplayMetrics. DENSITY_DEFAULT ; 
  31.     
  32.     private final Paint mPaint = new Paint ( Paint. ANTI_ALIAS_FLAG ) ; 
  33.     private String mText ; 
  34.     private ArrayList  mTextLines ; 
  35.     private final int [ ] textSize = new int [ 2 ] ; 
  36.  
  37.     public FloatImageText ( Context context, AttributeSet attrs, int defStyle ) { 
  38.         super (context, attrs, defStyle ) ; 
  39.         init ( ) ; 
  40.     } 
  41.  
  42.     public FloatImageText ( Context context, AttributeSet attrs ) { 
  43.         super (context, attrs ) ; 
  44.         init ( ) ; 
  45.     } 
  46.  
  47.     public FloatImageText ( Context context ) { 
  48.         super (context ) ; 
  49.         init ( ) ; 
  50.     } 
  51.     
  52.     private void init ( ) { 
  53.         mTargetDentity = getResources ( ). getDisplayMetrics ( ). densityDpi ; 
  54.         mTextLines = new ArrayList  ( ) ; 
  55.         
  56.         mPaint. setTextSize ( 14 ) ; 
  57.         mPaint. setColor ( Color. RED ) ; 
  58.         
  59.     } 
  60.     
  61.     
  62.  
  63.     @Override 
  64.     protected void onMeasure ( int widthMeasureSpec, int heightMeasureSpec ) { 
  65.         int w = 0, h = 0 ; 
  66.         //图片大小 
  67.         w += bitmapFrame. width ( ) ; 
  68.         h += bitmapFrame. height ( ) ; 
  69.         
  70.         //文本宽度 
  71.         if ( null != mText && mText. length ( ) > 0 ) { 
  72.             mTextLines. clear ( ) ; 
  73.             int size = resolveSize ( Integer. MAX_VALUE, widthMeasureSpec ) ; 
  74.             measureAndSplitText (mPaint, mText, size ) ; 
  75.             final int textWidth = textSize [ 0 ], textHeight = textSize [ 1 ] ; 
  76.             w += textWidth ; //内容宽度 
  77.             if (h < textHeight ) { //内容高度 
  78.                 h = ( int ) textHeight ; 
  79.             } 
  80.         } 
  81.         
  82.         w = Math. max (w, getSuggestedMinimumWidth ( ) ) ; 
  83.         h = Math. max (h, getSuggestedMinimumHeight ( ) ) ; 
  84.         
  85.         setMeasuredDimension ( 
  86.                 resolveSize (w, widthMeasureSpec ), 
  87.                 resolveSize (h, heightMeasureSpec ) ) ; 
  88.     } 
  89.     
  90.     @Override 
  91.     protected void onDraw ( Canvas canvas ) { 
  92.         //绘制图片 
  93.         if ( null != mBitmap ) { 
  94.             canvas. drawBitmap (mBitmap, null, bitmapFrame, null ) ; 
  95.         } 
  96.         
  97.         //绘制文本 
  98.         TextLine line ; 
  99.         final int size = mTextLines. size ( ) ; 
  100.         for ( int i = 0 ; i < size ; i ++ ) { 
  101.             line = mTextLines. get (i ) ; 
  102.             canvas. drawText (line. text, line. x, line. y, mPaint ) ; 
  103.         } 
  104.         System. out. println (mTextLines ) ; 
  105.     } 
  106.     
  107.     
  108.     public void setImageBitmap (Bitmap bm ) { 
  109.         setImageBitmap (bm, null ) ; 
  110.     } 
  111.     
  112.     public void setImageBitmap (Bitmap bm, int left, int top ) { 
  113.         setImageBitmap (bm, new Rect (left, top, 0, 0 ) ) ; 
  114.     } 
  115.     
  116.     public void setImageBitmap (Bitmap bm, Rect bitmapFrame ) { 
  117.         mBitmap = bm ; 
  118.         computeBitmapSize (bitmapFrame ) ; 
  119.         requestLayout ( ) ; 
  120.         invalidate ( ) ; 
  121.     } 
  122.     
  123.     public void setText ( String text ) { 
  124.         mText = text ; 
  125.         requestLayout ( ) ; 
  126.         invalidate ( ) ; 
  127.     } 
  128.     
  129.     private void computeBitmapSize (Rect rect ) { 
  130.         if ( null != rect ) { 
  131.             bitmapFrame. set (rect ) ; 
  132.         } 
  133.         if ( null != mBitmap ) { 
  134.             if (rect. right == 0 && rect. bottom == 0 ) { 
  135.                 final Rect r = bitmapFrame ; 
  136.                 r. set (r. left, r. top, 
  137.                         r. left + mBitmap. getScaledHeight (mTargetDentity ), 
  138.                         r. top + mBitmap. getScaledHeight (mTargetDentity ) ) ; 
  139.             } 
  140.         } else { 
  141.              bitmapFrame. setEmpty ( ) ; 
  142.         } 
  143.     } 
  144.     
  145.     private void measureAndSplitText ( Paint p, String content, int maxWidth ) { 
  146.         FontMetrics fm = mPaint. getFontMetrics ( ) ; 
  147.         final int lineHeight = ( int ) (fm. bottom - fm. top ) ; 
  148.         
  149.         final Rect r = new Rect (bitmapFrame ) ; 
  150. //        r.inset(-5, -5); 
  151.         
  152.         final int length = content. length ( ) ; 
  153.         int start = 0, end = 0, offsetX = 0, offsetY = 0 ; 
  154.         int availWidth = maxWidth ; 
  155.         TextLine line ; 
  156.         boolean onFirst = true ; 
  157.         boolean newLine = true ; 
  158.         while (start < length ) { 
  159.             end ++; 
  160.             if (end == length ) { //剩余的不足一行的文本 
  161.                 if (start <= length - 1 ) { 
  162.                     if (newLine ) offsetY += lineHeight ; 
  163.                     line = new TextLine ( ) ; 
  164.                     line. text = content. substring (start, end - 1 ) ; 
  165.                     line. x = offsetX ; 
  166.                     line. y = offsetY ; 
  167.                     mTextLines. add (line ) ; 
  168.                 } 
  169.                 break ; 
  170.             } 
  171.             p. getTextBounds (content, start, end, tmp ) ; 
  172.             if (onFirst ) { //确定每个字符串的坐标 
  173.                 onFirst = false ; 
  174.                 final int height = lineHeight + offsetY ; 
  175.                 if (r. top >= height ) { //顶部可以放下一行文字 
  176.                     offsetX = 0 ; 
  177.                     availWidth = maxWidth ; 
  178.                     newLine = true ; 
  179.                 } else if (newLine && (r. bottom >= height && r. left >= tmp. width ( ) ) ) { //中部左边可以放文字 
  180.                     offsetX = 0 ; 
  181.                     availWidth = r. left ; 
  182.                     newLine = false ; 
  183.                 } else if (r. bottom >= height && maxWidth - r. right >= tmp. width ( ) ) { //中部右边 
  184.                     offsetX = r. right ; 
  185.                     availWidth = maxWidth - r. right ; 
  186.                     newLine = true ; 
  187.                 } else { //底部 
  188.                     offsetX = 0 ; 
  189.                     availWidth = maxWidth ; 
  190.                     if (offsetY < r. bottom ) offsetY = r. bottom ; 
  191.                     newLine = true ; 
  192.                 } 
  193.             } 
  194.             
  195.             if (tmp. width ( ) > availWidth ) { //保存一行能放置的***字符串 
  196.                 onFirst = true ; 
  197.                 line = new TextLine ( ) ; 
  198.                 line. text = content. substring (start, end - 1 ) ; 
  199.                 line. x = offsetX ; 
  200.                 mTextLines. add (line ) ; 
  201.                 if (newLine ) { 
  202.                     offsetY += lineHeight ; 
  203.                     line. y = offsetY ; 
  204.                 } else { 
  205.                     line. y = offsetY + lineHeight ; 
  206.                 } 
  207.                 
  208.                 start = end - 1 ; 
  209.             } 
  210.         } 
  211.         textSize [ 1 ] = offsetY ; 
  212.     } 
  213.     
  214.     class TextLine { 
  215.         String text ; 
  216.         int x ; 
  217.         int y ; 
  218.         
  219.         @Override 
  220.         public String toString ( ) { 
  221.             return "TextLine [text=" + text + ", x=" + x + ", y=" + y + "]" ; 
  222.         } 
  223.     } 
  224. }  

分享名称:Android自定义View实现HTML图文环绕效果
网页URL:http://www.shufengxianlan.com/qtweb/news0/281600.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联