2012-05-02 10 views
7

Vorrei usare Canvas.drawText() per visualizzare testo multicolore. Più specificamente, voglio evidenziare una sottostringa del testo passato al metodo drawText().È possibile visualizzare testo multicolore con una chiamata a Canvas.drawText()?

Il testo è sotto forma di SpannableString con 0 o più oggetti ForegroundColorSpan.

Guardando il codice Canvas, sembra che una chiamata .toString() sul CharSequence passato, significa che questo non è possibile.

C'è un modo alternativo?

MODIFICA: il testo può occasionalmente cambiare (modifiche totali, non incrementali). Inoltre, ci sono potenzialmente più testi posizionati in diverse posizioni non correlate nella visualizzazione personalizzata.

+0

Uso Shader per il testo multi colore –

+0

Grazie, ma non riesco a vedere come raggiungere questo obiettivo. Quale classe Shader in particolare? –

risposta

25

Sì, è possibile utilizzando uno dei Layout classi. Queste sono classi helper per disegnare il testo su una tela e supportano Spannable. Se il tuo testo non cambia usa un StaticLayout.

Esempio

aggiungere questo alla vostra abitudine vista della classe

private StaticLayout layout; 

inserire questo codice nel vostro onLayout o onSizeChanged

Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers"); 

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

TextPaint paint = new TextPaint(); 
paint.setTextSize(20f); 
paint.setColor(Color.RED); 
layout = new StaticLayout(wordtoSpan, paint, getWidth(), Alignment.ALIGN_NORMAL, 1, 0, false); 

Poi, nel tuo metodo di disegno semplicemente chiamare

Se il testo cambia spesso, è possibile utilizzare uno DynamicLayout.

Editable.Factory fac = Editable.Factory.getInstance(); 
Editable edit = fac.newEditable(wordtoSpan); 
DynamicLayout layout = new DynamicLayout(edit,paint,getWidth(),Alignment.ALIGN_CENTER,1,0,false); 

cambiamento del testo utilizzando l'oggetto di modifica

edit.append("hello"); 
+0

Eccellente, grazie. Questo sembra molto promettente. Nel mio caso, il testo cambia. In questo caso, potrebbe essere utilizzata una sorta di chiamata invalidate() per ottenere ciò che voglio? –

+0

In questo caso si utilizza semplicemente [DynamicLayout] (http://developer.android.com/reference/android/text/DynamicLayout.html) oppure creare un nuovo layout ogni volta che il testo cambia. – Renard

+0

ok, guarderò in questo. In effetti, sto visualizzando più stringhe quindi suppongo un DynamicLayout per ogni stringa? Inoltre, quando il testo cambia, l'intero testo cambia (vale a dire NON è come il testo che viene modificato in un EditText). Questo influenza la soluzione desiderata? –

0

provare qualcosa di simile, se si utilizza TextView

String multiColorText = "<font color=0xff0000>Multi</font><font color=0x000000>Color</font><font color=0xccffff>Text</font>"; 

textView.setText(Html.fromHtml(multiColorText)); 

Edit: Per SpannableString, controllare se il sottostante si aiuta

Spannable WordtoSpan = new SpannableString("partial colored text"); 

WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
+0

Siamo spiacenti, non sto usando un TextView. –

+0

Risposta modificata .. Spero che aiuti –

0

Ogni volta che si scrive che il testo per quella vista è possibile impostare thatView.setBackgroundResource (R.drawable.multicolor); e

In multicolor.xml scrittura

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
    <gradient 
      android:startColor="@color/tabBgStart" 
      android:endColor="@color/tabBgEnd" 
      android:angle="270"/> 
</shape> 

speranza che funziona sicuramente

Per modificare il colore del testo è possibile utilizzare yourView.setTextColor (R.drawable.multicolor);

1

non utilizzato con Canvas. vedi sotto codice come l'ho usato in textview.

public TextView getTextClipArt1(){ 
    TextView textView = new TextView(context); 
    Typeface tf = new MyTypeface(context, 0).getTypeface(); 

    Shader textShader=new LinearGradient(0, 0, 0, 30, 
      new int[]{Color.GREEN,Color.BLUE}, 
      new float[]{0, 1}, TileMode.CLAMP); 

    textView.setTypeface(tf); 
    textView.getPaint().setShader(textShader); 
    textView.getPaint().setStyle(Paint.Style.STROKE); 
    textView.getPaint().setStrokeWidth(2); 
    textView.setText("ABC"); 
    textView.setTextSize(30); 
    textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    return textView; 
} 

è ora possibile disegnare la visualizzazione del testo come bitmap su tela, anche se penso che questi metodi esistano anche nella classe di pittura. Spero utile a voi.

Problemi correlati