Текст с градиентом в Android

Как я расширился бы TextView позволить рисунок текста с эффектом градиента?

56
задан Casebash 21 April 2010 в 06:21
поделиться

2 ответа

Невозможно расширить 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 . Если это будет сделано, то, к сожалению, привязка для рисуемого текста всегда будет внизу, поэтому мы должны добавить -textPaint.getFontMetricsInt (). Ascent () к нашей координате y.

{ {1}}
20
ответ дан 26 November 2019 в 17:00
поделиться

Простым, но несколько ограниченным решением было бы использование этих атрибутов:

android:fadingEdge="horizontal"
android:scrollHorizontally="true"

Я использовал его в текстовых полях, где я хочу, чтобы они исчезли, если они получат слишком долго.

3
ответ дан 26 November 2019 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: