Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Для создания текстовой метки с градиентом воспользуемся классом LinearGradient.
Конструктор класса имеет семь аргументов. Первые четыре аргумента задают координаты линии, вдоль которой идёт рисование градиента. Следующие два аргумента задают цвета градиентов, а последний аргумент показывает способ рисования за пределами прямоугольника.
Создадим новый класс GradientTextView, наследующий от TextView:
package ru.alexanderklimov.fortest;
import android.content.Context;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.util.AttributeSet;
import android.graphics.Shader;
import android.widget.TextView;
public class GradientTextView extends TextView {
public GradientTextView(Context context) {
super(context, null, -1);
}
public GradientTextView(Context context, AttributeSet attrs) {
super(context, attrs, -1);
}
public GradientTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
getPaint().setShader(
new LinearGradient(0, 0, 0, getHeight(), Color.WHITE,
Color.BLACK, Shader.TileMode.CLAMP));
}
}
}
Параметр Shader.TileMode.CLAMP означает, что цвет районах за пределами прямоугольника (0, 0) - (0, 100) будет совпадать с цветом ближайшей стороны прямоугольника.
Так как метод onDraw() слишком затратный, то закраску текста градиентом сделаем в методе onLayout(), который вызывается при изменении размеров текста. Этого вполне достаточно.
Добавляем новый компонент в разметку активности и настраиваем размеры, фон, текст. Результат на экране.
Используя ту же технику, можно использовать другие виды градиентов (LinearGradient, RadialGradient, SweepGradient), заполнить текст картинкой (BitmapShader) или даже комбинировать шейдеры (ComposeShader).