android TextView实现部分渐变色

gradient

参考帖子:

https://www.cnblogs.com/itchq/p/4138966.html

https://blog.csdn.net/inwhites/article/details/81917086

https://www.jianshu.com/p/a9d09cb7577f

 

LinearGradientFontSpan.java:
/**
 * FileName: LinearGradientFontSpan
 * Author: bai
 * Date: 2019/4/17 15:26
 */
public class LinearGradientFontSpan extends ReplacementSpan {
    private int mSize;
    private int mode;

    public LinearGradientFontSpan(int mode) {
        this.mode = mode;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        mSize = Math.round(paint.measureText(text, start, end));
        //这段不可以去掉,字体高度没设置,可能出现draw()方法没有被调用,如果你调用SpannableStringBuilder后append一个字符串,效果也是会出来,下面这段就不需要了
        // 原因详见https://stackoverflow.com/questions/20069537/replacementspans-draw-method-isnt-called
        Paint.FontMetricsInt metrics = paint.getFontMetricsInt();
        if (fm != null) {
            fm.top = metrics.top;
            fm.ascent = metrics.ascent;
            fm.descent = metrics.descent;
            fm.bottom = metrics.bottom;
        }
        return mSize;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        float rrr = paint.descent() - paint.ascent();
        LinearGradient lg = null;
        if(mode == 0){//上下渐变
            lg = new LinearGradient(0, 0, 0, paint.descent() - paint.ascent(),
                    0xffff0000,
                    0xff00ff00,
                Shader.TileMode.REPEAT); //从上到下渐变
        }else{//左右渐变

//            lg = new LinearGradient(0, 0, mSize, 0,
//                    new int[] { 0xffff0000, 0xffffffff, 0xff00ff00 },
//                    new float[] { 0,0.5f, 0.8f},
//                    Shader.TileMode.REPEAT); //从左到右渐变

            //lg = new LinearGradient(paint.descent() - paint.ascent(),0,0,0,new int[]{Color.RED,Color.BLACK,Color.YELLOW},new float[]{0,0.5f,1}, Shader.TileMode.REPEAT);

            lg = new LinearGradient(mSize,0,0,0,new int[]{Color.RED,Color.BLACK,Color.YELLOW},new float[]{0,0.5f,1}, Shader.TileMode.REPEAT);
        }
        paint.setShader(lg);
        canvas.drawText(text, start, end, x, y, paint);//绘制文字
    }
}
MainActivity.java使用:
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val spannable = SpannableString("城市的夜晚霓虹灯璀璨\n" +",点亮了黑暗赶不走孤单")
        val span = LinearGradientFontSpan( 1)
        spannable.setSpan(span,3,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        spannableTextView.text=spannable

        //文字上下渐变
        val result = getRadiusGradientSpan("城市的夜晚霓虹灯璀璨\n,点亮了黑暗赶不走孤单")
        spannableVerticalTextView.text=result
    }


     private fun getRadiusGradientSpan(string:String):SpannableString{
         val spannableStringBuilder = SpannableString(string);
         val span = LinearGradientFontSpan(0);
         spannableStringBuilder.setSpan(span, 0, spannableStringBuilder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         return spannableStringBuilder;
     }
}

 

demo源码https://download.csdn.net/download/u010326875/11125338

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠天515

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值