2013-06-06 4 views
6

У меня есть файл, содержащий градиент (textgradient.xml) в моей доступной папке. Мне нужно поставить этот градиент как цвет текста TextView через Java. Как это сделать?Как установить градиент как цвет текста TextView?

+0

Пожалуйста, обратитесь это [1]: HTTP: //stackoverflow.com/questions/2680607/text-with-gradient-in-android Я думаю, это поможет вам. –

+0

@pankaj Нет, это не дубликат. Мне нужно сделать это, используя градиент XML, а не градиент кода Java! –

ответ

-5

Вам просто нужно создать ресурс, пригодный для рисования (см. Пример ниже), и добавить его в макет, созданный для вашего ListItem.

вытяжка (в вашем разрешении \ вытяжка папка - назвать его как - listgrad.xml для экс) может выглядеть следующим образом:

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

вы бы добавить его в макет для вашего списка элемента (расположение .xml файл, который вы определите для этого), как этот фрагмент кода:

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

...

+1

Только текст должен иметь градиент, а не весь текст ... –

+1

Почему два ответа здесь? –

1

это не представляется возможным расширить TextView нарисовать текст с градиентом. Однако достичь этого эффекта можно, создав холст и опираясь на него. Сначала нам нужно объявить наш пользовательский элемент интерфейса. В начале нам нужно создать подкласс 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. Если это будет сделано, то, к сожалению, якорь для рисованного текста всегда будет внизу, поэтому мы должны объявить d -textPaint.getFontMetricsInt(). ascent() для нашей координаты y.

+1

Но как это сделать с моим градиентом XML-файла? –