2013-06-06 14 views
6

Mam plik zawierający gradient (textgradient.xml) w moim folderze rysowania. Muszę umieścić ten gradient jako kolor tekstu TextView przez Javę. Jak to zrobić?Jak ustawić gradient jako kolor tekstu w TextView?

+0

Proszę odnieść to [1]: http: //stackoverflow.com/questions/2680607/text-with-gradient-in-android Myślę, że to ci pomoże. –

+0

@pankaj Nie, to nie jest duplikat. Muszę to zrobić za pomocą gradientu XML, a nie gradientu kodu Java! –

Odpowiedz

-5

Wystarczy utworzyć zasób do rysowania (patrz przykład poniżej) i dodać go do układu utworzonego dla elementu ListItem.

odkształcalne (w twoich res \ odkształcalne folder - nazwać cokolwiek - listgrad.xml ex) mógłby wyglądać następująco:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
<gradient 
    android:startColor="@color/gradient_start" 
    android:endColor="@color/gradient_end" 
    android:angle="-270" /> 
</shape> 

należy dodać go do układu dla elementu listy (układ .xml plik można zdefiniować do tego) jak ten fragment kodu:

<TextView 
    android:id="@+id/ranking_order" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_grad" 
    /> 

...

+1

Tylko tekst musi mieć gradient, a nie cały widok tekstowy ... –

+1

Dlaczego dwie odpowiedzi tutaj? –

1

nie wydaje się możliwe, aby rozszerzyć TextView wyciągnąć tekst z gradientem. Efekt ten można jednak osiągnąć, tworząc płótno i rysując na nim. Najpierw musimy zadeklarować nasz niestandardowy element interfejsu użytkownika. W inicjacji musimy stworzyć podklasę Układu. W tym przypadku użyjemy BoringLayout, który obsługuje tylko tekst z pojedynczą linią.

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); 

Następnie zastąpić onMeasure i 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); 
} 

Nasza realizacja OnDraw jest w tym momencie dość leniwy (nie jest to całkowicie ignoruje specyfikacje pomiarowych !, ale tak długo, jak zagwarantować, że widok jest biorąc pod uwagę wystarczającą ilość miejsca, powinien on działać poprawnie:

Alternatywnie możliwe byłoby dziedziczenie z Canvas i nadpisanie metody onPaint .Jeśli to zostanie zrobione, to niestety kotwica dla narysowanego tekstu zawsze będzie na dole, więc musimy do reklam d -textPaint.getFontMetricsInt(). ascent() do naszej współrzędnej y.

+1

Ale jak to zrobić z gradientem pliku XML? –

Powiązane problemy