2010-01-27 1 views
10

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

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

ответ

18

С точки зрения вашего первого вопроса, я боролся с этим, а также, и это не выглядит как есть любой подходящий методы в самих 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); 
    } 
} 
+0

Это почти работает, но удар обрезается. Эта ссылка содержит более подробную информацию: http://www.betaful.com/2012/01/programmatic-shapes-in-android/ – mxcl

+0

Вышеупомянутая ссылка нарушена. Это обновленная ссылка: http://betaful.com/post/82668809883/programmatic-shapes-in-android –

+0

@ ShamsShafiq, @ Stev_k @ moraes, я попытался использовать ваш этот, а также ответ betauful.com на создавайте границу с угловым радиусом программно ... и она работает очень хорошо, но также создает край вне представления. Представление, которое я получил, присутствует на ссылке https://drive.google.com/file/d/0BwkVxZWl7VcETlIySV82NC1sV2s/view?usp=sharing, поэтому, пожалуйста, помогите мне удалить седеющий край. – TheReprator

5

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

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

Попробуйте это .... в вытяжке сделать новый файл 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> 
Смежные вопросы