2014-11-14 26 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中设置文本,然后检索尺寸,加大半径尺寸并使用它? – 2014-11-14 14:21:36

+0

@ user3427079,“半径大小的两倍” - 如何在不为此特定按钮创建其他xml的情况下执行此操作? – Vasiliy 2014-11-14 14:35:31

+0

textView.getWidth()* 2,类似于我想像的那样 – 2014-11-14 14:44:11

回答

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 2015-01-20 09:57:40

+0

@Vasiliy我们在我们的项目中一直在使用这种类型的东西;希望它有用。 – matiash 2015-01-20 17:21:16

0

我有一个更好的方法来做到这一点。而不是Ring使用Oval和赋予行程与颜色白色和宽度@dimen/big_ring_button_thickness 但这不给你圆形。要实现圆形形状,您的按钮应该是方形的,我的意思是按钮的宽度和高度应该相同。

相关问题