Попытка нарисовать кнопку: как установить цвет обводки и как «выровнять» градиент по дну, не зная высоты? - PullRequest
10 голосов
/ 27 января 2010

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 08 сентября 2010

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

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);
    }
}
6 голосов
/ 15 июня 2011

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

setShape(GradientDrawable.RECTANGLE);
setCornerRadii(new float[]{2,2,2,2,2,2,2,2});
1 голос
/ 04 июля 2013

Попробуйте это .... в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...