似乎无法扩展 TextView 以使用渐变绘制文本。但是,可以通过创建画布并在其上绘图来实现此效果。首先,我们需要声明我们的自定义 UI 元素。在初始化中,我们需要创建一个 Layout 的子类。在这种情况下,我们将使用 BoringLayout,它只支持单行文本。
Shader textShader=new LinearGradient(0, 0, 0, 20,
new int[]{bottom,top},
new float[]{0, 1}, TileMode.CLAMP);//Assumes bottom and top are colors defined above
textPaint.setTextSize(textSize);
textPaint.setShader(textShader);
BoringLayout.Metrics boringMetrics=BoringLayout.isBoring(text, textPaint);
boringLayout=new BoringLayout(text, textPaint, 0, Layout.Alignment.ALIGN_CENTER,
0.0f, 0.0f, boringMetrics, false);
然后我们覆盖 onMeasure 和 onDraw:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
setMeasuredDimension((int) textPaint.measureText(text), (int) textPaint.getFontSpacing());
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
boringLayout.draw(canvas);
}
在这一点上,我们的 onDraw 实现非常懒惰(它完全忽略了测量规范!但只要您保证视图有足够的空间,它应该可以正常工作。
或者,可以从 Canvas 继承并覆盖 onPaint 方法。如果这样做了,那么不幸的是,正在绘制的文本的锚点将始终位于底部,因此我们必须将 -textPaint.getFontMetricsInt().ascent() 添加到我们的 y 坐标中。