Создание background для элемента программно

170
22 мая 2018, 07:10

Есть задача создать такой backfround для элемента, чтобы там был stroke с градиентом, а также был закругленные края у этого элемента. Делать это нужно программно, так как цвет градиента будет меняться.

Как можно это сделать?

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <corners android:radius="2dp"/>
        <gradient
            android:angle="360"
            android:startColor="#543456"
            android:endColor="#ff00b5"
            android:type="linear" />
        <size android:width="24dp"
            android:height="24dp"/>
    </shape>
</item>
<item
    android:bottom="2dp"
    android:left="2dp"
    android:right="2dp"
    android:top="2dp">
    <shape android:shape="rectangle" >
        <solid android:color="#fff" />
    </shape>
</item>

Answer 1

Сделал вьюху для примера:

public class StackGradientView extends LinearLayout {
public StackGradientView(Context context) {
    super(context);
    init();
}
public StackGradientView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}
public StackGradientView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}
private void init() {
    setBackground(generateCoolDrawable(new int[]{Color.parseColor("#543456"), Color.parseColor("#ff00b5")}));
}
private Drawable generateCoolDrawable(int[] startEndGradient) {
    GradientDrawable gd = new GradientDrawable(
            GradientDrawable.Orientation.LEFT_RIGHT,
            startEndGradient);
    gd.setCornerRadius(20f);
    GradientDrawable rectangle = new GradientDrawable();
    rectangle.setShape(GradientDrawable.RECTANGLE);
    rectangle.setColor(Color.WHITE);
    Drawable[] layers = new Drawable[]{
            gd,
            rectangle
    };
    LayerDrawable layerDrawable = new LayerDrawable(layers);
    layerDrawable.setLayerInset(1, 40, 40, 40, 40);
    return layerDrawable;
}
public void changeColor() {
    setBackground(generateCoolDrawable(new int[]{Color.parseColor("#ffffff"), Color.parseColor("#ff00cc")}));
}
}

Переделайте размеры чтобы из dp to px конвертировались.

READ ALSO
После 43 строки excel не меняет формат ячеек Apache POI

После 43 строки excel не меняет формат ячеек Apache POI

Не могу понять, не применяется формат ячейки начиная с 44 строки

174
Правила именований папок и пакетов

Правила именований папок и пакетов

Как правильно именовать папки? org

161
HTML/JS кнопка создает форму [закрыт]

HTML/JS кнопка создает форму [закрыт]

Как сделать так, чтобы после нажатия на кнопку создавалась форма?

193
Как исправить баг анимации?

Как исправить баг анимации?

Есть у меня флексбокс, внутри которого 2 блока(В одном форма, а в другом изображение)

161