TextView добавление градиента и тени - PullRequest
16 голосов
/ 07 сентября 2011

У меня проблема.Я хотел бы иметь текстовое изображение с градиентом в качестве цвета.И черная тень за ним.Проблема в том, что тень использует цвет градиента вместо того, чтобы использовать вызываемый цвет (Color.BLACK)

Мой код: numberTextView = (TextView)findViewById(R.id.something);

    Shader textShaderTop = new LinearGradient(0, 30, 0, 60,
                new int[]{Color.parseColor("#A6A6A6"), Color.parseColor("#E8E8E8"), Color.parseColor("#A6A6A6")},
                new float[]{0, 0.5f, 1}, TileMode.CLAMP);
    numberTextView.getPaint().setShader(textShaderTop);

    numberTextView.setShadowLayer(
              0.1f,   //float radius
              20f,  //float dx
              20f,  //float dy 
              Color.BLACK //this is not black on the screen, but it uses the gradient color!?
              );

Кто-нибудь знаетчто делать

Ответы [ 2 ]

18 голосов
/ 21 сентября 2011

У меня была точно такая же проблема.Мне удалось это исправить, расширив TextView и переопределив метод onDraw.Вот как это выглядит

@Override
protected void onDraw(Canvas canvas) {
    // draw the shadow
    getPaint().setShadowLayer(1, 1, 1, 0xbf000000); // or whatever shadow you use
    getPaint().setShader(null);
    super.onDraw(canvas);

    // draw the gradient filled text
    getPaint().clearShadowLayer();
    getPaint().setShader(new LinearGradient(0, getHeight(), 0, 0, 0xffacacac, 0xffffffff, TileMode.CLAMP)); // or whatever gradient/shader you use
    super.onDraw(canvas);
}

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

1 голос
/ 14 декабря 2018

Спасибо за ответ Сидона.Это помогло мне.

И я добавил этот ответ, потому что я нашел способ использовать цвета с прозрачностью в градиенте.Поэтому, пожалуйста, сначала обратитесь к ответу Сидона и наберите его.

Я нашел ниже описание метода setShadowLayer из здесь .

Альфа альфатень будет альфа краской, если цвет тени непрозрачный, или альфа из цвета тени, если нет.

Таким образом, point is shadowColor должен быть непрозрачным, чтобы использовать цвета с прозрачностью в градиенте.

Вот код.

@Override
protected void onDraw(Canvas canvas) {
    // draw the shadow
    getPaint().setShader(null);
    setTextColor(0x00ffffff); // set the paint's alpha by 00
    getPaint().setShadowLayer(3.0f, 1.5f, 1.8f, shadowColor); // shadowColor must be not opaque
    super.onDraw(canvas);

    // draw the gradient filled text
    getPaint().clearShadowLayer();
    setTextColor(0xffffffff); // set the paint's alpha by ff
    getPaint().setShader(new LinearGradient(0, 0, getWidth(), getHeight(), 0x7fff8809, 0x7f09ffff, Shader.TileMode.CLAMP)); // or whatever gradient/shader you use
    super.onDraw(canvas);
}

Если shadowColor непрозрачный, вы можете изменить его как непрозрачный, уменьшив альфа на единицу.

if((shadowColor >>> 24) == 0xff)
    shadowColor &= 0xfeffffff;

Еще раз спасибодля ответа Сидона.

2018-12-16 Редактировать:

Если у вас одинаковое альфа-значение для цветов, код ниже будет лучше.

public class TextView_Gradient extends TextView {

    public TextView_Gradient(Context context) {
        super(context);
        setTextColor(0x3fffffff); // set the paint's alpha by 3f
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // draw the shadow
        getPaint().setShader(null);
        // shadowColor must be opaque.
        getPaint().setShadowLayer(3.0f, 1.5f, 1.8f, shadowColor);
        super.onDraw(canvas);

        // draw the gradient filled text
        getPaint().clearShadowLayer();
        // gradient colors must be opaque, too.
        getPaint().setShader(new LinearGradient(0, 0, getWidth(), getHeight(), 0xffff8809, 0xff09ffff, Shader.TileMode.CLAMP));
        super.onDraw(canvas);
    }
}

Поскольку альфатени будет альфа-краской, если цвет тени непрозрачный.А альфа цветов градиента - это альфа краски, если альфа цветов градиента ff (непрозрачный).

(или конечная альфа текста может быть снова масштабирована по альфа-значению цвета градиента при условии, чтоальфа краски ff.)

Вывод: enter image description here

...