Trying to draw a button: how to set a stroke color and how to "align" a gradient to the bottom without knowing the height?

android

Solution

In terms of your first question, I struggled with this as well, and it doesn't look like there are any suitable methods within Drawables themselves (I was using `ShapeDrawable`) or the Paint class. However, I was able to extend `ShapeDrawable` and override the draw method, as below, to give the same result:

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);
    }
}

Problem

I am creating a button programmatically. It is rounded and has a gradient background, and works fine and looks nice, but I couldn't do two things I wanted: - Set a 1 pixel stroke with a given color. I tried getPaint().setStroke(), but couldn't figure how to set the stroke color. How should I do it? - Align the gradient to the bottom of the button, no matter what height it has. Is this possible? For reference, this is the code I'm using: ``` 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); ```

Original source