ImageSpan图片不能居中的问题
使用ImageSpan的童鞋应该都会遇到这样一个困惑,图片不能居中显示,ImageSpan中只有ImageSpan.ALIGN_BASELINE与ImageSpan.ALIGN_BOTTOM两个选项,关键是即使设置了这个参数,在不同手机上可能出现的情况还不同,同一段代码,可能有的居上,有的居下...
其实这个很容易解决,继承ImageSpan重写getSize()和draw()方法即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">draw</span><span class="hljs-params">(Canvas canvas, CharSequence text, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end, <span class="hljs-keyword">float</span> x, <span class="hljs-keyword">int</span> top, <span class="hljs-keyword">int</span> y, <span class="hljs-keyword">int</span> bottom, Paint paint)</span> </span>{ <span class="hljs-keyword">try</span> { Drawable d = getDrawable(); canvas.save(); <span class="hljs-keyword">int</span> transY = <span class="hljs-number">0</span>; transY = ((bottom-top) - d.getBounds().bottom) / <span class="hljs-number">2</span>+top; canvas.translate(x, transY); d.draw(canvas); canvas.restore(); } <span class="hljs-keyword">catch</span> (Exception e) { } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getSize</span><span class="hljs-params">(Paint paint, CharSequence text, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end, FontMetricsInt fm)</span> </span>{ <span class="hljs-keyword">try</span> { Drawable d = getDrawable(); Rect rect = d.getBounds(); <span class="hljs-keyword">if</span> (fm != <span class="hljs-keyword">null</span>) { FontMetricsInt fmPaint = paint.getFontMetricsInt(); <span class="hljs-keyword">int</span> fontHeight = fmPaint.bottom - fmPaint.top; <span class="hljs-keyword">int</span> drHeight = rect.bottom - rect.top; <span class="hljs-keyword">int</span> top = drHeight / <span class="hljs-number">2</span> - fontHeight / <span class="hljs-number">4</span>; <span class="hljs-keyword">int</span> bottom = drHeight / <span class="hljs-number">2</span> + fontHeight / <span class="hljs-number">4</span>; fm.ascent = -bottom; fm.top = -bottom; fm.bottom = top; fm.descent = top; } <span class="hljs-keyword">return</span> rect.right; } <span class="hljs-keyword">catch</span> (Exception e) { <span class="hljs-keyword">return</span> <span class="hljs-number">20</span>; } } |
另外在设置spannString.setSpan最后一个flags参数,
分别有
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、
Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、
Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、
Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)
四个选项,包括即与span指定的内容格式一致,如span为红色字体,如果前面包括后面不包括,则在span内容的前面输入是红色字体(与span一致),后面输入是默认颜色字体。如果ImageSpan是图片,则需要设置前后都不包括,不然,包括的部分输入文字会不可见。
ps: 之前在其他博客写的文章(2016-05-18 09:58)
源码下载
http://itlao5.com/wp/file/MyImageSpan.java