android按钮自定义颜色和圆角

时间:2013-02-02 17:54:52

标签: android button colors

我正在制作一个绘图应用,用户可以在其中选择自定义颜色。选择颜色后,customBtn会通过以下代码将其颜色更改为所选颜色:

     customBtn.setBackgroundColor(Color.argb(alphaSeekBar.getProgress(), redSeekBar.getProgress(), 
        greenSeekBar.getProgress(), blueSeekBar.getProgress()));

然而,这使按钮成为方角。

我希望它是圆角,当按下时,它会变成灰色。

已经存在selector.xml并显示如下,但我怎样才能将所有内容整合在一起,以便

  1. 未按下时会显示自定义颜色,圆角和
  2. 按下时会变灰(并保持圆角)?
  3. 选择

    <item android:state_pressed="true" >         
        <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
            <stroke android:width="2dp" android:color="@color/black" />
            <solid android:color="@color/grey"/>
            <padding android:left="5dp" android:top="2dp" 
                android:right="5dp" android:bottom="2dp" /> 
            <corners android:radius="5dp" /> 
        </shape>    
    </item>
    
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
            <stroke android:width="2dp" android:color="@color/black" />
            <solid android:color="@color/???-- how to amend---??"/>
            <padding android:left="5dp" android:top="2dp" 
                android:right="5dp" android:bottom="2dp" /> 
            <corners android:radius="5dp" /> 
        </shape>
    </item>
    

    编辑:以编程方式设置圆角,因为定制颜色不是静态的,用户可以根据要求更改定制颜色

     customColorCode = Color.argb(alphaSeekBar.getProgress(), redSeekBar.getProgress(), 
             greenSeekBar.getProgress(), blueSeekBar.getProgress());         
    
    
    
     RoundRectShape rs = new RoundRectShape(new float[] { 10, 10, 10, 10, 10, 10, 10, 10}, null, null);
     ShapeDrawable sd = new ShapeDrawable(rs);
     customBtn.setBackgroundDrawable(sd);
     customBtn.setBackgroundColor(customColorCode);
    

    以编程方式解决问题:

    选择自定义颜色之前的按钮完美显示圆角,在选择定制颜色后设置然后返回平方颜色,可能是因为setBackgroundColor行放在最后一个代码上。然而,我已经尝试过它,但仍然是平方的颜色。如何修改?

    谢谢!

1 个答案:

答案 0 :(得分:0)

由于您不支持全范围状态,如普通按钮(聚焦,禁用,按下,激活等),并且默认状态和按下状态之间的唯一区别是纯色。也许[PorterColorFilter][1]可行。我认为您可以按原样设置按下状态,并将默认状态设置为白色。然后将颜色过滤器应用于具有设置自定义颜色的按钮。您可能需要尝试一些过滤模式,但我认为DST_ATOP将取代白色,而不是黑色边框。并且当按钮上触发向下MotionEvent时(或者称为触发的按下状态),您可能希望使用手势检测器来移除滤色器。

简短的回答是Android按钮不能很好地满足您的需求。它们往往需要静态可绘制的东西来定义它们在不同状态下的外观。

一个选项是限制颜色选择并为每种颜色创建一个drawable,并根据用户的选择设置drawable。我不知道您的按钮出现在哪种上下文中,但建议您按照正常按钮的触摸反馈示例来为用户提供一致性。

注意:setBackgroundColor具有误导性,它只是将Button drawable设置为color drawable,它将替换圆角矩形drawable。这就是为什么当你这样做时它变成了一个矩形。