Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

TextView с градиентом

Для создания текстовой метки с градиентом воспользуемся классом 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(), который вызывается при изменении размеров текста. Этого вполне достаточно.

Добавляем новый компонент в разметку активности и настраиваем размеры, фон, текст. Результат на экране.

GradientTextView

Используя ту же технику, можно использовать другие виды градиентов (LinearGradient, RadialGradient, SweepGradient), заполнить текст картинкой (BitmapShader) или даже комбинировать шейдеры (ComposeShader).

Реклама