Попытка нарисовать кнопку: как установить цвет штриха и как "выровнять" градиент на дно, не зная высоты?

Я создаю кнопку программно. Он округлен и имеет градиентный фон, отлично работает и выглядит красиво, но я не мог сделать две вещи, которые я хотел:

  • Установите 1 пиксельный ход с заданным цветом. Я попробовал getPaint(). SetStroke(), но не мог понять, как установить цвет штриха. Как мне это сделать?
  • Совместите градиент в нижней части кнопки, независимо от высоты. Возможно ли это?

Для справки, это код, который я использую:

Button btn = new Button(context);
btn.setPadding(7, 3, 7, 5);
btn.setTextColor(text_color);

// Create a gradient for the button. Height is hardcoded to 30 (I don't know the height beforehand). 
// I wish I could set the gradient aligned to the bottom of the button.
final Shader shader = new LinearGradient(0, 0, 0, 30,
    new int[] { color_1, color_2 },
    null, Shader.TileMode.MIRROR);

float[] roundedCorner = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }
ShapeDrawable normal = new ShapeDrawable(new RoundRectShape(roundedCorner, null, null));
normal.getPaint().setShader(shader);
normal.setPadding(7, 3, 7, 5);

// Create a state list (I suppressed settings for pressed).
StateListDrawable state_list = new StateListDrawable();
state_list.addState(new int[] { }, normal);

btn.setBackgroundDrawable(state_list);

Ответ 1

С точки зрения вашего первого вопроса, я тоже боролся с этим, и не похоже, что в самих Drawables есть подходящие методы (я использовал ShapeDrawable) или класс Paint. Тем не менее, я смог расширить ShapeDrawable и переопределить метод draw, как показано ниже, для получения того же результата:

public class CustomBorderDrawable extends ShapeDrawable {
    private Paint fillpaint, strokepaint;
    private static final int WIDTH = 3; 

    public CustomBorderDrawable(Shape s) {
        super(s);
        fillpaint = this.getPaint();
        strokepaint = new Paint(fillpaint);
        strokepaint.setStyle(Paint.Style.STROKE);
        strokepaint.setStrokeWidth(WIDTH);
        strokepaint.setARGB(255, 0, 0, 0);
    }

    @Override
    protected void onDraw(Shape shape, Canvas canvas, Paint fillpaint) {
        shape.draw(canvas, fillpaint);
        shape.draw(canvas, strokepaint);
    }

    public void setFillColour(int c){
        fillpaint.setColor(c);
    }
}

Ответ 2

Вы можете использовать метод GradientDrawable с методом setStroke (3, Color.WHITE). Чтобы сделать закругленные углы, используйте это:

setShape(GradientDrawable.RECTANGLE);
setCornerRadii(new float[]{2,2,2,2,2,2,2,2});

Ответ 3

Попробуйте это.... в drawable создайте новый xml файл и установите его там, где хотите.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#e1e1e1" />

    <stroke
        android:width="2dp"
        android:color="#808080" />

    <corners android:radius="10dp" />

    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />

</shape>