2014-11-14 2 views
2

следующие предложения в некоторых других должностей, я реализовал круговой кнопки, которые будут использоваться в приложении:Android - как определить конфигурируемый Форма Размер

circular button

Это осуществляется с помощью селектора XML:

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

    <!-- Non focused states 
    --> 
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" 
     android:drawable="@drawable/big_ring_button_unfocused" /> 
    <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" 
     android:drawable="@drawable/big_ring_button_unfocused" /> 
    <!-- Focused states 
    --> 
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" 
     android:drawable="@drawable/big_ring_button_focused" /> 
    <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" 
     android:drawable="@drawable/big_ring_button_focused" /> 
    <!-- Pressed 
    --> 
    <item android:state_pressed="true" android:drawable="@drawable/big_ring_button_pressed" /> 
</selector> 

содержимое ..._ сфокусировано файла (другие просто изменить цвета):

<shape 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="ring" 
android:innerRadius="@dimen/big_ring_button_inner_radius" 
android:thickness="@dimen/big_ring_button_thickness" 
android:useLevel="false"> 

<solid android:color="@color/white" /> 

</shape> 

Я хотел бы использовать этот шаблон для всех закругленных кнопок в моем приложении, но так как текст внутри кнопок меняется, размер кнопки сам по себе должен измениться.

Я думал, что смогу выполнить это программно, поэтому я проверил документацию GradientDrawable - там нет способа изменить атрибут innerRadius.

В настоящее время у меня есть 4 файла XML на каждую круглую кнопку (селектор, не сфокусированный, сфокусированный и нажатый), что крайне уродливо и станет болью в области шеи для поддержания.

Как я могу сделать эту кнопку настраиваемой по размеру (либо XML, либо программно)?

Благодаря

+0

Предположим, вы можете установить текст в TextView с правильным масштабированием размера, затем получить размеры, удвоить размер радиуса и использовать его? –

+0

@ user3427079, «double size for the radius» - как это сделать, не создавая дополнительные xml для этой конкретной кнопки? – Vasiliy

+0

textView.getWidth() * 2, что-то вроде того, что я представляю –

ответ

3

Вы не можете изменить атрибут innerRadius программно, как это только для чтения из XML атрибутов при раздувании (смотри, например, this answer).

Однако вы могли бы достичь более или менее того же эффекта программным путем, используя пользовательский способ рисования для рисования кольца. Например:

public class RoundBorderDrawable extends GradientDrawable 
{ 
    private static final int RING_THICKNESS = 20; 
    private static final int PADDING = 8; 
    private static final int NORMAL_COLOR = Color.BLUE; 
    private static final int PRESSED_COLOR = Color.RED; 

    private Paint mPaint; 

    public RoundBorderDrawable() 
    { 
     mPaint = new Paint(); 
     mPaint.setStyle(Style.STROKE); 
     mPaint.setStrokeWidth(RING_THICKNESS); 
     mPaint.setColor(NORMAL_COLOR); 
    } 

    @Override 
    public boolean isStateful() 
    { 
     return true; 
    } 

    @Override 
    protected boolean onStateChange(int[] stateSet) 
    { 
     boolean result = super.onStateChange(stateSet); 

     int color = NORMAL_COLOR; 
     for (int i = 0; i < stateSet.length; i++) 
     { 
      if (stateSet[i] == android.R.attr.state_pressed) 
       color = PRESSED_COLOR; 
     } 

     if (color != mPaint.getColor()) 
     { 
      mPaint.setColor(color); 
      invalidateSelf(); 
      result = true; 
     } 

     return result; 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     super.draw(canvas); 
     int diameter = Math.min(canvas.getWidth(), canvas.getHeight()) - RING_THICKNESS - 2 * PADDING; 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, diameter/2, mPaint); 
    } 
} 

Это будет нарисовать круг, который соответствует внутри Button размеров (я предположил, что вы хотели, чтобы нарисовать круг, даже для неквадратных кнопок).

Затем просто установите новый экземпляр RoundBorderDrawable в качестве фона вашей кнопки (свойства, которые являются константами в этом примере, могут, конечно, поставляться через конструктор или с помощью методов setter).

+0

Спасибо за ваш вклад.Я не могу проверить ваш обходной путь прямо сейчас, но сейчас это самый перспективный подход. – Vasiliy

+0

@ Vasiliy Мы использовали что-то подобное в наших проектах; надеюсь, это полезно. – matiash

0

У меня есть лучший подход для этого. Вместо Ring используйте Oval и дайте штрих с белым цветом и шириной @dimen/big_ring_button_thickness , но это не дает вам круглую форму. Чтобы получить круглую форму, ваша кнопка должна быть квадратной, я имею в виду, что ширина и высота кнопки должны быть одинаковыми.

Смежные вопросы