TextView добавляет градиент И тень
У меня проблема. Я хотел бы иметь textview с градиентом как цвет. И за ним черная тень. Проблема заключается в том, что тень использует цвет градиента вместо использования вызываемого цвета (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!?
);
Кто-нибудь знает, что делать
Ответы
Ответ 1
У меня была точно такая же проблема.
Мне удалось исправить это, расширив 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);
}
Однако этот метод, вероятно, не будет работать, если вы хотите использовать цвета с прозрачностью в своем градиенте.
Ответ 2
Спасибо за ответ Сидона. Это помогло мне.
И я добавляю этот ответ, потому что я нашел способ использовать цвета с прозрачностью в градиенте. Поэтому, пожалуйста, сначала обратитесь к ответу Сидона и отзовитесь.
Я нашел ниже в "setShadowLayer" Метод Описание от здесь.
Альфа тени будет альфой краски, если цвет тени непрозрачный, или альфой цвета тени, если нет.
Итак, point is shadowColor должен быть непрозрачным, чтобы использовать цвета с прозрачностью в градиенте.
Вот код.
@Override
protected void onDraw(Canvas canvas) {
// draw the shadow
getPaint().setShader(null);
setTextColor(0x00ffffff); // set the paint 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 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;
Спасибо еще раз за ответ Сидона.