问题来了 如何让一个TextView 垂直渐变并更换字体

最近接到一个需求要求字体垂直渐变当然不带动画 只有字体颜色渐变 同时要设置字体风格

后面的就是实现需求了 然而当我实现起来。。起初实现了ondraw onlayout 等等等等 wtf' 绘制是如此费劲

后来细看Gradient 就是线性渐变。。其实不管怎么写也都得用这个 开始直接设置这些是没问题的,比如这样

设置起始颜色 gettextSize 就是字体大小了 这样在y轴表示纵向 你可以尝试改变其他三个位置来试试

LinearGradient mLinearGradient = new LinearGradient(0, 0, 0,
                tv.getPaint().getTextSize(),
                Color.white,Color.black,
                Shader.TileMode.CLAMP);
        tv.getPaint().setShader(mLinearGradient);

 但是我显示出来的效果并不是很好颜色值对不上,,,,wtf 猜测是因为当textView包裹内容时我们设置了字体大小会自动有内边距开始渐变并不是从字上开始的是从整个控件开始的比如下面

第一次效果

wtf 效果不对 不是从我想要的颜色开始。。。

后来看到 有这样一种方法 颜色数组  位置数组。。简直快速开发蒙骗测试之良心方法啊

LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],
            @Nullable float positions[], @NonNull TileMode tile) 

于是我这样写了下



 setTextColorGradient(mTv1, Color.WHITE,Color.parseColor("#5A5A5A"),0.6f,0.8f);

public void setTextColorGradient(TextView tv, int startColor, int endColor, float start, float end) {
        LinearGradient mLinearGradient = new LinearGradient(0, 0, 0,
                tv.getPaint().getTextSize(),
                new int[]{startColor, endColor},
                new float[]{start, end},
                Shader.TileMode.CLAMP);
        tv.getPaint().setShader(mLinearGradient);
    }

效果就变成了这样。。。。

具体效果自己根据坐标调 

奉上方法

/**
     * 修改字体
     * @param tv
     */
    public void setTextFont(TextView tv) {
        /*assets目录下新建 fonts 并将资源放到里面并按照如下方式读取设置*/
        Typeface fontFace1 = Typeface.createFromAsset(getAssets(),
                "fonts/DIN-MEDIUM.OTF");
        Typeface fontFace2 = Typeface.createFromAsset(getAssets(),
                "fonts/DINENGSCHRIFT.OTF");
        tv.setTypeface(fontFace1);
    }

    /**
     * @param tv         控件
     * @param startColor 开始颜色 Color.WHITE
     * @param endColor   结束颜色 Color.parseColor("#5A5A5A")
     * @param start      开始位置 0.4f
     * @param end        结束位置 0.9f
     */
    public void setTextColorGradient(TextView tv, int startColor, int endColor, float start, float end) {
        LinearGradient mLinearGradient = new LinearGradient(0, 0, 0,
                tv.getPaint().getTextSize(),
                new int[]{startColor, endColor},
                new float[]{start, end},
                Shader.TileMode.CLAMP);
        tv.getPaint().setShader(mLinearGradient);
    }

    /**
     * @param tv           控件
     * @param colorList    开始到结束颜色集合 new int[] { sratrColor,endColor}
     * @param locationList 对应上述颜色的坐标点 new float[]{0f,1.0f}
     */
    public void setTextColorGradient(TextView tv, int[] colorList, float[] locationList) {
        LinearGradient mLinearGradient = new LinearGradient(0, 0, 0,
                tv.getPaint().getTextSize(),
                colorList,
                locationList,
                Shader.TileMode.CLAMP);
        tv.getPaint().setShader(mLinearGradient);
    }

三周写一个应用第二周设计图才出来妈的 真是要命啊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值