Техника, которую вы используете для создания линии в нижней части вида, работает, если цвет слоя, наложенного на слой градиента, непрозрачен.То, что вы пытаетесь сделать, это применить прозрачный слой, который заменяет (стирает) основной градиент.Это не так: прозрачное наложение оставляет базовый цвет, здесь градиент, нетронутым.
Вот альтернативный список слоев, который можно использовать для API 23 +:
underline_drawable.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="bottom">
<shape>
<size android:height="2dp" />
<gradient
android:angle="0"
android:centerY="0.5"
android:endColor="#FFFFFFFF"
android:startColor="@color/colorPrimaryDark" />
</shape>
</item>
</layer-list>
Вот как это выглядит:
![enter image description here](https://i.stack.imgur.com/O499v.png)
До API 23Вы можете использовать следующую настраиваемую отрисовку, но она должна быть задана в коде.
GradientUnderline.java
public class GradientUnderline extends Drawable {
private Shader mShader;
private final Paint mPaint;
private int mHeight = -1;
private int mStartColor = Color.BLACK;
private int mEndColor = Color.WHITE;
private int mLastWidth;
public GradientUnderline() {
mPaint = new Paint();
}
public GradientUnderline(int lineHeight, int startColor, int endColor) {
mPaint = new Paint();
mHeight = lineHeight;
mStartColor = startColor;
mEndColor = endColor;
}
@Override
public void draw(@NonNull Canvas canvas) {
if (mShader == null || getBounds().width() != mLastWidth) {
mLastWidth = getBounds().width();
mShader = new LinearGradient(0, 0, getBounds().width(), mHeight, mStartColor,
mEndColor, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
}
canvas.drawRect(0, getBounds().height() - mHeight, getBounds().width(),
getBounds().height(), mPaint);
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
}
Я изначально пропустил наличие android:gravity
потому что это не упоминается на странице "Drawable Resources" .Это упоминается, однако, в документации LayerDrawable
;