TextView小技巧记录下

在textView前面添加图片标记
忘了是看谁的博客 大致写法都差不多

 SpannableString string = new SpannableString("  " + item.getContent());
                VerticalImageSpan imageSpan = new VerticalImageSpan(mContext, R.drawable.icon_guang_hot);
                string.setSpan(imageSpan, 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                contentText.setText(string);
/**
 * 图文拼接居中显示
 * @author: wangben
 * @date: 2020/8/13 
 */
public class VerticalImageSpan extends ImageSpan {

    public VerticalImageSpan(Context context, int resourceId) {
        super(context, resourceId);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        Drawable b = getDrawable();
        canvas.save();
        int transY = 0;
        //获得将要显示的文本高度 - 图片高度除2 = 居中位置+top(换行情况)
        transY = ((bottom - top) - b.getBounds().bottom) / 2 + top;
        //偏移画布后开始绘制
        canvas.translate(x, transY);
        b.draw(canvas);
        canvas.restore();
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end,
                       Paint.FontMetricsInt fm) {
        Drawable d = getDrawable();
        Rect rect = d.getBounds();
        if (fm != null) {
            Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
            //获得文字、图片高度
            int fontHeight = fmPaint.bottom - fmPaint.top;
            int drHeight = rect.bottom - rect.top;
            int top = drHeight / 2 - fontHeight / 4;
            int bottom = drHeight / 2 + fontHeight / 4;
            fm.ascent = -bottom;
            fm.top = -bottom;
            fm.bottom = top;
            fm.descent = top;
        }
        return rect.right;
    }
}

文字的渐变颜色

  /**
  		 使用方法
         * 在自定义的 LinearGradientFontSpan 中 text不会draw  添加TextView.BufferType.SPANNABLE
         */
        mTvPrice.setText(TextColorGradientUtlis.getGradientSpan("10", Color.BLUE, Color.RED, false), TextView.BufferType.SPANNABLE)
/**
 * @author: wangben
 * @date: 2020/9/2
 * 工具类
 */
object TextColorGradientUtlis {
    //默认上到下   isLeftToRight  为true  左到右
    @JvmStatic
    fun getGradientSpan(string: String?, startColor: Int, endColor: Int, isLeftToRight: Boolean): SpannableStringBuilder? {
        val spannableStringBuilder = SpannableStringBuilder(string)
        val span = LinearGradientFontSpan(startColor, endColor, isLeftToRight)
        spannableStringBuilder.setSpan(span, 0, spannableStringBuilder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        // 若有需要可以在这里用SpanString系列的其他类,给文本添加下划线、超链接、删除线...等等效果
        return spannableStringBuilder
    }
}
/**
 * @ClassName: LinearGradientFontSpan
 * @Description: 文字渐变的Span类
 * @Author: wangben
 * @date: 2020/9/2
 * 这段代码是学习 佐手邊倖冨的博客   没有绘画drwa的原因是因为  text需要设置  TextView.BufferType.SPANNABLE 属性
 */
public class LinearGradientFontSpan extends ReplacementSpan {


    // 文字宽度
    private int mSize;
    // 渐变开始颜色
    private int startColor = Color.BLUE;
    // 渐变结束颜色
    private int endColor = Color.RED;
    // 是否左右渐变
    private boolean isLeftToRight = true;

    public LinearGradientFontSpan() {

    }

    public LinearGradientFontSpan(int startColor, int endColor, boolean leftToRight) {
        this.startColor = startColor;
        this.endColor = endColor;
        this.isLeftToRight = leftToRight;
    }


    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        mSize = (int) (paint.measureText(text, start, end));
        return mSize;
    }


    @Override
     public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint){
       // 修改y1的值从上到下渐变, 修改x1的值从左到右渐变
        LinearGradient lg;
         if (isLeftToRight) {    
            lg = new LinearGradient(0, 0, mSize, 0,
                    startColor,
                    endColor,
                    Shader.TileMode.REPEAT);
                 } else {
          lg = new LinearGradient(0, 0, 0, paint.descent() - paint.ascent(),
                    startColor,
                    endColor,
                    Shader.TileMode.REPEAT);
        }
         paint.setShader(lg);
        canvas.drawText(text, start, end, x, y, paint);//绘制文字
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值