70 votes

Texte avec dégradé dans Android

Comment pourrais-je étendre TextView pour permettre le dessin de texte avec un effet de dégradé ?

140voto

Taras Points 531
TextView secondTextView = new TextView(this);
Shader textShader=new LinearGradient(0, 0, 0, 20,
            new int[]{Color.GREEN,Color.BLUE},
            new float[]{0, 1}, TileMode.CLAMP);
secondTextView.getPaint().setShader(textShader);

1 votes

Sur mon appareil ICS, cela ne semble pas fonctionner -- c'est complètement transparent. Quelqu'un d'autre voit la même chose ? La vue n'est pas accélérée par le matériel.

15 votes

@Steve Prentice : peut-être que y1 = 20 est trop court, donc vous ne pouvez pas voir de gradient, essayez : new LinearGradient(0,0,0,0,secondTextView.getPaint().getTextSize(),....) - peut-être cela résoudra-t-il votre problème

1 votes

Existe-t-il un moyen de le faire en XML à la place ?

21voto

Casebash Points 22106

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.

10voto

koush Points 1406

J'ai mis en place une bibliothèque qui englobe ces deux méthodes. Vous pouvez créer GradientTextView en XML ou simplement utiliser GradientTextView.setGradient(TextView text...) pour le faire sur un objet TextView ordinaire.

https://github.com/koush/Widgets

3voto

pgsandstrom Points 5085

Une solution simple mais quelque peu limitée serait d'utiliser ces attributs :

android:fadingEdge="horizontal"
android:scrollHorizontally="true"

Je l'ai utilisé sur des champs de texte où je voulais qu'ils s'effacent s'ils étaient trop longs.

0 votes

C'est un joli coup. Je ne pense pas que vous puissiez le faire fonctionner verticalement ? Il n'y a pas de propriété Android:scrollVertically pour autant que je puisse voir.

0 votes

Désolé, je ne sais pas comment faire :(

0voto

Android Points 318

Voici un exemple pour linearlayout, vous pouvez utiliser cet exemple pour textview aussi, et dans le code source il n'y aura pas de codage de gradient, vous obtenez le code source et ajoutez le code de ce site lui-même - http://Android-codes-examples.blogspot.com/2011/07/design-linearlayout-or-textview-and-any.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X