Il ne semble pas possible d'étendre TextView pour dessiner du texte avec un dégradé. Il est cependant possible d'obtenir cet effet en créant un canevas et en dessinant dessus. Tout d'abord, nous devons déclarer notre élément d'interface utilisateur personnalisé . Dans l'initiation, nous devons créer une sous-classe de Mise en page . Dans ce cas, nous utiliserons BoringLayout qui ne prend en charge que les textes d'une seule ligne.
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);
Nous passons ensuite outre onMeasure
et 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);
}
Notre mise en œuvre de onDraw
est à ce stade assez paresseux (il ignore complètement les spécifications de mesure !), mais tant que vous garantissez que la vue a suffisamment d'espace, cela devrait fonctionner correctement.
Alternativement, il serait possible d'hériter d'une Canvas
et remplacer le onPaint
méthode. Si l'on procède ainsi, l'ancre du texte dessiné se trouvera toujours en bas de l'écran. -textPaint.getFontMetricsInt().ascent()
à notre coordonnée y.