首页 > 代码库 > 透明行间距的TextView
透明行间距的TextView
如果一个Textview需要bg,很见的那,如果告诉你行间距需要是透明的,估计就头大了,不过我头大过一次了,希望以后别人不再头大
里面用到了canvas的clip操作,但是硬件加速的时候却不支持这个操作,所以,最好禁止硬件加速,并添加try控制,如果exception了,只好反放弃这个效果,让super方法了继续绘制
里面用到了canvas的clip操作,但是硬件加速的时候却不支持这个操作,所以,最好禁止硬件加速,并添加try控制,如果exception了,只好反放弃这个效果,让super方法了继续绘制
标签: Android
[1].[文件] AlphaLineSpaceTextView.java ~ 2KB 下载(9) 跳至 [1]
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | package com.phodev.andtools.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.graphics.Path; import android.graphics.Region.Op; import android.text.Layout; import android.util.AttributeSet; import android.widget.TextView; /** * 透明间距的TextView * * @author skg * */ public class AlphaLineSpaceTextView extends TextView { // as thin as possible private boolean thinStyle = false ; public AlphaLineSpaceTextView(Context context, AttributeSet attrs, int defStyle) { super (context, attrs, defStyle); } public AlphaLineSpaceTextView(Context context, AttributeSet attrs) { super (context, attrs); } public AlphaLineSpaceTextView(Context context) { super (context); } private final Path path = new Path(); @Override public void draw(Canvas canvas) { Layout layout = getLayout(); if (layout == null ) { super .draw(canvas); return ; } Paint paint = layout.getPaint(); float spacingAdd = layout.getSpacingAdd(); if (spacingAdd > 0 && paint != null ) { int linesCount = getLineCount(); int maxWith = getWidth(); int saveCount = canvas.save(); FontMetrics fm = paint.getFontMetrics(); int descent = ( int ) (fm.descent + 0 .5f); int topOffset; int bottomOffset; path.reset(); if (thinStyle) { // clip first line top path.moveTo( 0 , 0 ); path.lineTo(maxWith, 0 ); path.lineTo(maxWith, descent); path.lineTo( 0 , descent); path.close(); try { canvas.clipPath(path, Op.DIFFERENCE); } catch (Exception e) { } // topOffset = -descent; bottomOffset = 0 ; } else { topOffset = -descent - 2 ; bottomOffset = 0 ; } // clip every line bottom for ( int i = 0 ; i < linesCount; i++) { int top = layout.getLineBaseline(i) - topOffset; int bottom = layout.getLineBottom(i) - bottomOffset; /* * Log.d("ttt", "---- baseline:" + layout.getLineBaseline(i) + * " bottom:" + layout.getLineBottom(i) + "descent:" + descent); */ path.reset(); path.moveTo( 0 , top); path.lineTo(maxWith, top); path.lineTo(maxWith, bottom); path.lineTo( 0 , bottom); path.close(); try { canvas.clipPath(path, Op.DIFFERENCE); } catch (Exception e) { } } // super .draw(canvas); canvas.restoreToCount(saveCount); return ; } super .draw(canvas); } } |
透明行间距的TextView
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。