精华内容
下载资源
问答
  • 主要介绍了Android开发实现按钮点击切换背景并修改文字颜色的方法,涉及Android界面布局与相关属性设置技巧,需要的朋友可以参考下
  • android通过按钮改变背景颜色,需要学习的同学可以下载研究。
  • 改变Android按钮背景颜色的高效方法

    万次阅读 2016-03-16 23:02:30
    本文将介绍一种有效改变Android按钮颜色的方法。 按钮可以在状态改变时改变其颜色(例如按下,禁用,高亮显示)。但是,这需要一一说明每个状态。这篇文章将提供你一个根据状态变化轻松改变按钮颜色的方法。如果你...

    本文将介绍一种有效改变Android按钮颜色的方法。

    按钮可以在状态改变时改变其颜色(例如按下,禁用,高亮显示)。但是,这需要一一说明每个状态。这篇文章将提供你一个根据状态变化轻松改变按钮颜色的方法。如果你正在写自定义视图,那么不妨也来读一读,因为中间我会涉及到如何用自定义属性实现自定义视图的相关内容。

    如何实现

    Android提供了灵活的绘制选择机制,可根据视图状态转变视图外观。每个状态通过一个单独的部分而存在。例如:在正常、禁用、按下、高亮状态下的按钮有着不同的背景颜色。请看下面的代码示例:

    button_1_background.xml

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    <selector xmlns:android= "http://schemas.android.com/apk/res/android" >
    <!&mdash; pressed state -->
    <item android:drawable= "@drawable/button_1_selected" android:state_pressed= "true" />
    <!-- focused state -->
    <item android:drawable= "@drawable/button_1_focused" android:state_focused= "true" />
    <!--  default state -->
    <item android:drawable= "@drawable/button_1_normal" />
    </selector>

    每个状态drawables的属性(button_1_selected, button_1_focused,button_1_normal)必须定义在相应的在drawables目录下:

    button_1_normal.xml

    ?
    1
    2
    3
    4
    <shape xmlns:android= "http://schemas.android.com/apk/res/android" >
         <solid android:color= "@color/button_1_normal_background" />
         <corners android:radius= "10dip" />
    </shape>

    button_1_focused.xml

    ?
    1
    2
    3
    4
    <shape xmlns:android= "http://schemas.android.com/apk/res/android" >
         <solid android:color= "@color/button_1_focused_background" />
         <corners android:radius= "10dip" />
    </shape>

    button_1_selected.xml

    ?
    1
    2
    3
    4
    <shape xmlns:android= "http://schemas.android.com/apk/res/android" >
         <solid android:color= "@color/button_1_selected_background" />
         <corners android:radius= "10dip" />
    </shape>

    然后设置按钮背景:

    ?
    1
    android:background= "@drawable/button_1_background"

    这种方法非常灵活。但是,当你的app有许多按钮,而每个按钮的颜色又各不相同时,维护每个按钮的上述所有XML文件就会变得异常困难起来。如果你改变正常状态的按钮颜色,那么你必须改变其他状态的颜色。在上面的例子中,每个按钮需要4个XML文件。那么如果你的应用程序有10个或更多个按钮呢?

    为了清楚说明我的意思,请看下面的截图:

     main screen.

     send screen.

    这些截图来自于一款免费产品BMEX。

    这两张图片分别是app的主屏幕和发送屏幕。两个屏幕都采用了Metro风格。每个屏幕都有6个不同颜色的按钮。并且按钮的颜色会根据状态的改变而改变。共计12个按钮,所以我们需要12个drawable selector XML文件和24个drawable state XML文件。并且随着app的发展,软件还得允许新的屏幕和新的按钮的添加。维护这些内容可不是一项简单的任务。

    为了使过程更加简单和高效,我们另寻了一种更有效的解决方案——并且已经实现在自定义按钮视图中。这是一个容易初始化的按钮。我们称之为RoundButton,因为它支持圆角。

    在另一个产品中,我们需要高亮功能,但是,又不想因此单独创建自定义视图。所以,我们把它添加到RoundButton中。请看下面的截图:

     highlighed.

    正如你所见,我们可以选择也可以不选屏幕上的按钮(顶部的列表图表和每个元素后面的添加图标)。当按钮被选中后,它的highlighted状态就被设置为true,反之,则为false。并且按钮的外观会作适当改变。在上面的例子中,高亮模式使用了“image”。在这种模式下,图像的可见象素会被绘制为高亮颜色。

    首先,我们为RoundButton定义属性集。这是一组可以通过布局XML设置的属性。

    attrs_round_button.xml

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <resources>
     
         <declare-styleable name= "RoundButton" >
             <attr name= "image" format= "reference" />
             <attr name= "bgcolor" format= "color" />
             <attr name= "text" format= "string" />
     
             <attr name= "radius" format= "float" />
     
             <attr name= "highlightColor" format= "color" />
             <attr name= "highlightMode" format= "enum" >
                 < enum name= "none" value= "0" />
                 < enum name= "image" value= "1" />
                 < enum name= "background" value= "2" />
             </attr>
         </declare-styleable>
     
    </resources>

    我们增加了 image,bgcolor,text,边框圆角半径,highlightColor和highlightMode属性。按下状态的颜色会从bgcolor导出(后面会描述的)。

    实现按钮

    首先,我们需要实现构造函数和解析参数。我们创建了3个不同的构造函数:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public RoundButton(Context context, AttributeSet attrs,  int defStyle) {
         super (context, attrs, defStyle);
     
         init(attrs, defStyle);
    }
     
    public RoundButton(Context context, AttributeSet attrs) {
         super (context, attrs);
     
         init(attrs,  0 );
    }
     
    public RoundButton(Context context) {
         super (context);
     
         init( null 0 );
    }

    所有这些构造函数调用init方法。

    现在,我们需要实现init方法。它将属性集和默认样式作为输入参数。在init方法中,我们获取属性值,并初始化内部变量。如果属性集为null,那就使用默认值。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    private void init(AttributeSet attrs,  int defStyle) {
         Drawable image;
         int bgcolor;
         String text;
     
         if (attrs !=  null ) {
             final TypedArray a = getContext().obtainStyledAttributes(attrs,
                     R.styleable.RoundButton, defStyle,  0 );
     
             image = a.getDrawable(R.styleable.RoundButton_image);
     
             bgcolor = a.getColor(R.styleable.RoundButton_bgcolor,  0xffffffff );
     
             text = a.getString(R.styleable.RoundButton_text);
     
             radius = a.getFloat(R.styleable.RoundButton_radius,  12 .0f);
     
             highlightMode = HighlightMode.getValue(a.getInt
             (R.styleable.RoundButton_highlightMode, HighlightMode.None.ordinal()));
     
             highlightColor = a.getColor(R.styleable.RoundButton_highlightColor,  0xff00b5ff );
     
             a.recycle();
         }
         else {
             image =  null ;
     
             text =  "" ;
     
             bgcolor =  0xff808080 ;
     
             radius =  12 .0f;
     
             highlightMode = HighlightMode.None;
     
             highlightColor =  0xff00b5ff ;
         }
     
         init(image, bgcolor, text);
    }

    然后,我们创建另一个init方法。这个方法用于创建对象,并需要渲染按钮的内容。 此处的init方法声明为public,因为创建RoundButton时需要调用它。它创建了背景和按下时的“喷漆(paint)”——绘制正常和按下状态时的背景的对象。按下的颜色选取比bgcolor更亮的颜色。使颜色变亮的的方法,稍后会进行说明。这里初始化了高亮模式。如果背景设置为高亮,那就创建高亮喷漆,用于绘制高亮时的按钮背景。如果图像模式设置为高亮,那就创建高亮图像。在createHighlightImage方法中创建图像的代码,之后会一一给出。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public void init(Drawable image,  int bgcolor, String text) {
         this .image = image;
     
         bgpaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         bgpaint.setColor(bgcolor);
     
         pressedBgpaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         pressedBgpaint.setColor(brighter(bgcolor));
     
         if (text ==  null )
             text =  "" ;
     
         this .text = text;
     
         textPaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         textPaint.setColor( 0xffffffff );
         textPaint.setTextAlign(Paint.Align.CENTER);
         textPaint.setTextSize(pixelsToSp(getContext(), textSize));
     
         if (highlightMode == HighlightMode.Background) {
             highlightPaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
             highlightPaint.setColor(highlightColor);
         }
         else if (highlightMode == HighlightMode.Image) {
             highlightImage = createHighlightImage();
         }
     
         setClickable( true );
    }

    要获得按下状态的色值,我们创建了brighter方法。它将颜色作为参数,并返回比该颜色更亮的颜色。这个方法也很简单:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public void init(Drawable image,  int bgcolor, String text) {
         this .image = image;
     
         bgpaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         bgpaint.setColor(bgcolor);
     
         pressedBgpaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         pressedBgpaint.setColor(brighter(bgcolor));
     
         if (text ==  null )
             text =  "" ;
     
         this .text = text;
     
         textPaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
         textPaint.setColor( 0xffffffff );
         textPaint.setTextAlign(Paint.Align.CENTER);
         textPaint.setTextSize(pixelsToSp(getContext(), textSize));
     
         if (highlightMode == HighlightMode.Background) {
             highlightPaint =  new Paint(Paint.ANTI_ALIAS_FLAG);
             highlightPaint.setColor(highlightColor);
         }
         else if (highlightMode == HighlightMode.Image) {
             highlightImage = createHighlightImage();
         }
     
         setClickable( true );
    }

    接下来的方法是createHighlightImage。当图像设置为高亮模式时,它会调用上面所示的方法。但是开头有一些比较棘手的代码。它需要得到图像的像素。然后处理像素 ——如果像素是不透明的(alpha != 0),就用高亮色值取代它,但是如果像素是透明的,那就不用改动。通过这种操作,我们创建了更高亮的图像。然后,我们将修改后的像素放回位图。并且在方法的最后,创建并返回BitmapDrawable。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    private Drawable createHighlightImage() {
         int width = image.getIntrinsicWidth();
         int height = image.getIntrinsicHeight();
     
         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
     
         Canvas canvas =  new Canvas(bitmap);
         image.setBounds( 0 0 , width, height);
         image.draw(canvas);
     
         int count = bitmap.getWidth() * bitmap.getHeight();
         int pixels[] =  new int [count];
     
         bitmap.getPixels(pixels,  0 , bitmap.getWidth(),  0 0 , bitmap.getWidth(), bitmap.getHeight());
         for ( int n =  0 ; n < count; n++) {
             boolean v = (Color.alpha(pixels[n])) !=  0 ;
     
             if (v) {
                 int pixel = pixels[n];
     
                 int alpha = Color.alpha(pixel);
                 int red = Color.red(highlightColor);
                 int green = Color.green(highlightColor);
                 int blue = Color.blue(highlightColor);
     
                 int color = Color.argb(alpha, red, green, blue);
     
                 pixels[n] = color;
             }
         }
     
         bitmap.setPixels(pixels,  0 , bitmap.getWidth(),  0 0 , bitmap.getWidth(), bitmap.getHeight());
     
         return new BitmapDrawable(getResources(), bitmap);
    }

    为了处理状态变化,我们需要处理触摸事件。所以需要实现触摸处理。当我们触摸按钮时,它的状态就会变为pressed(按下),并重绘按钮中的内容。当按钮没有被触摸,那它的pressed标志就设置为false,并重绘按钮中的内容。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    @Override
    public boolean onTouchEvent(MotionEvent event) {
         int action = event.getActionMasked();
     
         switch (action) {
         case MotionEvent.ACTION_DOWN:
             pressed =  true ;
             invalidate();
             break ;         
         case MotionEvent.ACTION_UP:
             pressed =  false ;
             invalidate();
             break ;
         case MotionEvent.ACTION_CANCEL:
         case MotionEvent.ACTION_OUTSIDE:
         case MotionEvent.ACTION_HOVER_EXIT:
             pressed =  false ;
             invalidate();
             break ;
         }
     
         return super .onTouchEvent(event);
    }

    然后,我们实现onDraw按钮方法。此方法绘制了按钮的内容。自定义视图首次展示以及每次重绘时就调用这个onDraw方法。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    protected void onDraw(Canvas canvas) {
         RectF bounds =  new RectF( 0 0 , getWidth(), getHeight());
     
         Drawable image =  null ;
         Paint bgPaint =  null ;
     
         switch (highlightMode) {
         case None:
             image =  this .image;
             bgPaint = pressed ? pressedBgpaint :  this .bgpaint;
             break ;
         case Background:
             image =  this .image;
             if (pressed)
                 bgPaint = pressedBgpaint;
             else
                 bgPaint = highlighted ? highlightPaint :  this .bgpaint;
             break ;
         case Image:
             image = highlighted ? highlightImage :  this .image;
             bgPaint = pressed ? pressedBgpaint :  this .bgpaint;
             break ;
         }
     
         if (radius !=  0 .0f)
             canvas.drawRoundRect(bounds, radius, radius, bgPaint);
         else
             canvas.drawRect(bounds, bgPaint);
     
         Rect textBounds =  new Rect();
         if (text.length() >  0 )
             textPaint.getTextBounds(text,  0 , text.length(), textBounds);
     
         float h_dst = ((image !=  null ) ? image.getMinimumHeight() +
         ((text.length() >  0 ) ? spacing :  0 ) :  0 ) + textBounds.height();
     
         float xd = (bounds.width() - ((image !=  null ) ? image.getMinimumWidth() :  0 )) /  2 ;
         float yd = (bounds.height() - h_dst) /  2 ;
     
         if (image !=  null ) {
             image.setBounds(( int ) xd, ( int ) yd, ( int )
             (xd + image.getMinimumWidth()), ( int ) (yd + image.getMinimumHeight()));
             image.draw(canvas);
         }
     
         float xt = (bounds.width() -  0 * textBounds.width()) /  2 ;
         float yt = yd + ((image !=  null ) ? image.getMinimumHeight() +
         ((text.length() >  0 ) ? spacing :  0 ) : textBounds.height()); // + textBounds.height();
     
         canvas.drawText(text, xt, yt, textPaint);
     
         if (checked && checkable && checkedImage !=  null ) {
             checkedImage.setBounds(( int ) (bounds.width() -
             checkedImage.getMinimumWidth()), ( int ) (bounds.height() - checkedImage.getMinimumHeight()),
                     ( int ) bounds.width(), ( int ) bounds.height());
             checkedImage.draw(canvas);
         }
    }

    用法

    为了整合RoundButton到代码,你需要下载源代码文件。在源代码文件中,有Eclipse项目,源代码和XML资源文件。你可以将它们复制到你的app项目中。或者编译RoundButton项目并将其作为库添加到你的项目。

    如果你使用的是可视化编辑器,那就直接从控件列表中选择RoundButton,在添加它之后,设置其属性。

    除了可视化编辑器,RoundButton既可以从布局XML,也可以从代码中插入。从布局XML添加的话,你可以这么使用。示例如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
         android:layout_width= "match_parent"
         android:layout_height= "wrap_content"
         android:focusable= "false"
         android:focusableInTouchMode= "false"
         android:descendantFocusability= "blocksDescendants"
         android:orientation= "horizontal"
         xmlns:app= "http://schemas.android.com/apk/res/com.bitgriff.bamp" >
     
         <com.bitgriff.bamp.helpers.RoundButton
             android:id= "@+id/button"
             app:radius= "0"
             app:image= "@drawable/ic_addtomedialibrary"
             app:bgcolor= "@color/transparent"
             app:highlightMode= "image"
             android:layout_width= "40dip"
             android:layout_height= "80dip"
             android:layout_centerVertical= "true"
             android:layout_alignParentRight= "true" />
     
    </RelativeLayout>

    从代码添加RoundButton,可以创造新的RoundButton实例。调用它的init方法传递图像(可为null),bgcolo和text。并添加RoundButton到你的ViewGroup:

    ?
    1
    2
    roundButton =  new RoundButton(context);
    roundButton.init(image, bgcolor, text);

    进一步设想

    此外,我们还可以改变RoundButton的形状。例如,制作圆形按钮,正如现在很多Android app中所见的那样。也可能配置图像位置(left、right、top、bottom)。等等。

    总结

    这篇文章主要描述了如何实现根据状态改变背景的自定义按钮。这个简单的组件能为我们节省很多时间。希望能对你有用。

    许可证

    这篇文章,以及相关源代码和文件,都是经过The BSD License许可的。

    译文链接: http://www.codeceo.com/article/android-button-color.html
    翻译作者: 码农网  – 小峰
    展开全文
  • 解决Android Studio中按钮背景颜色无法设置

    千次阅读 多人点赞 2021-02-14 22:22:58
    解决方法: 将res/values/themes.xml下的 <style name="Theme.HelloWorld" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> 改为 <style name="Theme.HelloWorld" parent="Theme....

    按钮颜色只保持默认色
    解决方法:
    将res/values/themes.xml下的

    <style name="Theme.HelloWorld" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    

    改为

    <style name="Theme.HelloWorld" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
    

    就是在最后面添加了一个Bridge改后效果
    转载自:
    https://www.cnblogs.com/linmob/p/14277303.html

    展开全文
  • 我们介绍了主题背景与样式的区别,以及为什么说通过主题背景和公共主题背景属性来分解您要实现的内容是一个不错的主意,请点击链接回顾:Android 样式系统 | 主题背景和样式Android 样式系统 | 常见的主题背景属性这...

    在 Android 样式系统系列的前几篇文章中,我们介绍了主题背景与样式的区别,以及为什么说通过主题背景和公共主题背景属性来分解您要实现的内容是一个不错的主意,请点击链接回顾:

    • Android 样式系统 | 主题背景和样式
    • Android 样式系统 | 常见的主题背景属性

    这会让我们通过创建更少的布局或样式,以隔离主题背景中的修改。在实际开发中,您通常希望根据主题背景改变颜色,因此您应该始终通过主题背景属性来引用颜色。这意味着您可以将如下代码视为有代码异味 (Code smell):

    <!-- Copyright 2019 Google LLC.

    相反,您应该使用主题背景属性,它允许您按主题更改颜色,例如,在深色主题中提供一个不同的值:

    <!-- Copyright 2019 Google LLC.
    • 深色主题https://developer.android.google.cn/guide/topics/ui/look-and-feel/darktheme

    即使您当前不支持其他主题 (什么,您的应用还没有支持深色主题?),我们依然建议您采用这种方法,因为这样会让新主题的采用变得更加简单。

    合格的 Colors 文件

    您可以通过在不同的配置中添加不同的值来改变颜色 (例如,在 res/values/colors.xml 中和在 res/values-night/colors.xml 中的备选值里均定义 @color/foo),但我们依然建议您使用主题背景属性来替代它们。对颜色层级的区分,会迫使您给颜色赋予语义化名称,换句话说,您应该不会在给颜色命名为 @color/white 的同时,又为深色模式提供一个深色变体,这会让人感到非常困惑。所以,您可能会想要使用一个语义化名称,例如 @color/background。这种方法带来的问题是它合并了颜色声明和具体的值,因此,它并没有指出颜色是可以或者能够随主题背景而变化的。@colors 的变化也会鼓励您创造更多颜色。如果在不同的情境下要使用具有相同值的、新的语义化命名的颜色 (即,不是背景色但应该使用相同颜色),这时候您仍需要在 colors 文件中创建新的条目。通过使用主题背景属性,我们可以将语义颜色的声明从提供它们的值中区分开来,而且让使用方更清楚地了解到颜色会随主题背景而变化 (因为它们使用 ?attr/ 语法)。将颜色声明保持为字面值,您就可以自定义应用使用的颜色调色板,并在主题背景级别修改它们,这会让 color.xml 较小且易维护。这种方法的额外好处是,布局/样式引用这些颜色时复用性变得更高。由于主题背景可以被覆盖或者改变,因此这间接表示: 您不需要创建其他布局或样式就可以更改某些颜色——您可以在相同的布局中使用不同的主题背景。

    始终使用?

    在某些情况下,您或许不想按照主题背景更改颜色。例如,在 Material Design 规范文档中提到,您可能希望在浅色和深色主题中均使用同一类型的颜色。

    • Material Design 规范文档https://material.io/design/color/dark-theme.html#ui-application

    d5dae7bafcc2b9f60d5580b17324330d.png

    在这种特殊情况下,直接引用颜色资源是再合适不过的:

    <!-- Copyright 2019 Google LLC.

    当前发展状况

    当使用 ColorStateLists 时,您可能也不会在您的布局/样式中直接引用主题背景属性。

    <!-- Copyright 2019 Google LLC.
    • ColorStateListshttps://developer.android.google.cn/reference/android/content/res/ColorStateList

    如果 primary_20 是一个 ColorStateList,它本身引用主题背景属性来获取色值也可能是合理的 (请参见下文)。ColorStateLists 通常为不同的状态 (按下,禁用等) 提供不同的颜色,但它还有另外一种可用于主题化功能您可在选取的颜色上指定透明度值:

    <!-- Copyright 2019 Google LLC.

    这种单项 ColorStateList (即只提供单个默认颜色,而非每种状态的不同颜色) 有助于减少您需要维护的颜色资源数量。它并没有定义一个新的颜色资源的方式来手动为您 (每一个配置文件) 的 primary 颜色设置 alpha 值,而是通过改变当前主题背景中的 colorPrimary 的方式。如果您的原始颜色发生了变化,则只需要在一个地方进行更新,无需调整所有已更新的地方。

    虽然此技术很有用,但仍有一些注意事项:

    1. 如果指定的颜色也具有 alpha 值,则 alpha 会被合并。例如,将 50% 的 alpha 应用于 50% 的不透明白色中,将产生 25% 的白色:

    <!-- Copyright 2019 Google LLC.

    因此,最好将主题背景颜色指定为完全不透明,然后使用 ColorStateLists 修改它们的 alpha。2. 仅在 API 23 中添加了 alpha 组件,因此,如果您的最小 sdk 低于这个版本,请确保使用支持此行为的 AppCompatResources.getColorStateList (并始终使用 android:alpha 命名空间,而绝不使用 app:alpha 命名空间)。

    • AppCompatResources.getColorStateListhttps://developer.android.google.cn/reference/androidx/appcompat/content/res/AppCompatResources.html#getColorStateList(android.content.Context,%20int)

    3. 通常,我们使用简写法,将颜色设置为 Drawable,例如:

    <!-- Copyright 2019 Google LLC.

    View 的背景是一个 Drawable,此简写把给定的颜色强转成了一个 ColorDrawable。但是没有办法把 ColorStateList 转换成 Drawable (API 29 之前使用 ColorStateListDrawable 解决这个问题)。

    • ColorDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorDrawable
    • ColorStateListDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorStateListDrawable

    但是,我们可以通过迂回的方式绕过此限制:

    <!-- Copyright 2019 Google LLC.

    请确保您的 backgroundTint 支持您的 View 所需的状态,例如,如果被禁用时需要更改。

    强制执行

    即使您已经说服自己使用主题背景属性和 ColorStateList,但如何在代码库或者团队中使用呢?您可以在 Code review 期间尝试保持警惕,但它的扩展性不是很好。更好的方法是依靠工具来解决此问题。
    《Making Android Lint Theme Aware》这篇文章简述了如何通过添加 Lint 检查来寻找直接引用颜色的用法,并涵盖了文中提及到的所有建议。

    • 《Making Android Lint Theme Aware》https://proandroiddev.com/making-android-lint-theme-aware-6285737b13bc

    间接使用

    使用主题背景属性和 ColorStateList 将颜色分解为主题背景的方法,可使您的布局和样式更加灵活,提高代码复用性并保持代码库的精简和易维护性。我们将在后续文章中介绍更多主题背景的用法以及它们之间的相互影响,感兴趣的读者请继续关注。

    展开全文
  • 设置圆角背景边框的的按钮 通过调节色彩明度自动计算按下(pressed)状态颜色 Gradle repositories { maven { url "https://jitpack.io" } } dependencies { compile 'com.github.czy1121:roundbutton:1.1.0' ...
  • 首先您需要绑定您的按钮在活动这样btnMale=(Button) findViewById(R.id.btnMale);btnFemale=(Button) findViewById(R.id.btnFemale);比我们的按钮setOnClickListener()这样btnMale.setOnClickListener(new View....

    首先您需要绑定您的按钮在活动这样

    btnMale=(Button) findViewById(R.id.btnMale);

    btnFemale=(Button) findViewById(R.id.btnFemale);

    比我们的按钮setOnClickListener()这样

    btnMale.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

    //btnMale.setBackgroundResource(R.drawable.background);// change background your button like this

    btnMale.setBackgroundColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimary));// use this to set color as background

    btnFemale.setBackgroundResource(android.R.drawable.btn_default;);// use this to set color as background

    }

    });

    btnFemale.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

    btnFemale.setBackgroundColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimary));// use this to set color as background

    btnMale.setBackgroundResource(android.R.drawable.btn_default;);// use this to set color as background

    }

    });

    展开全文
  • android开发设置Button背景颜色

    千次阅读 2021-07-11 22:59:05
    1 :在drawable里新建一个setbar_bg.xml,代码为 <?xml version="1.0" encoding="utf-8"?>...-- 背景色 --> <solid android:color="#00000000"/> <!-- 边框色 --> <str
  • Android按钮背景颜色(Android button background color)我想在我的应用程序中设置按钮的背景颜色,我无法实现我想要的结果...我试图设置的颜色是holo_green_light(#ff99cc00) 。 为了做到这一点,我使用...
  • Android studio 修改按钮背景颜色

    千次阅读 2021-11-30 22:30:20
    Android studio 修改按钮背景颜色
  • 你可以尝试自定义单选按钮,或者你可以简单地使用或膨胀视图来实现这种颜色选择器.使用xml:您需要在drawable文件夹中创建两个可绘制的资源文件.首先是这样的,android:shape="oval">android:width="48dp"android:...
  • Android Studio按钮背景

    千次阅读 2021-03-28 13:48:03
    Android Studio按钮背景色改变修改style.xml/theme.xml 在Android Studio里写前端界面,修改Button的背景样式一直是系统默认的主题色就像这样 不管怎么改颜色都会是系统的默认主题色,这里我们需要更改 Styles.xml...
  • android中在java代码中设置Button按钮背景颜色1.设置背景图片,图片来源于drawable;flightInfoPanel.setBackgroundDrawable(getResources().getDrawable(R.drawable.search_label_click));2.转换字符串为int(颜色...
  • android设置按钮背景透明

    千次阅读 2017-06-06 16:41:53
    android设置按钮背景透明和背景图片透明 (1)按钮背景透明修改配置文件 android:id="@+id/btnAppMore" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="详细信息>>" ...
  • Android 按钮背景颜色

    2020-03-17 06:07:49
    android按钮背景颜色
  • 这个thread将让你开始在xml文件中建立自己的标题栏,并在你的活动中使用它编辑这里是上面链接的内容的简要摘要 – 这只是设置文本的颜色和标题栏的背景 – 没有调整大小,没有按钮,只是最简单的示例res / layout / ...
  • 2.Java代码中设置button的背景颜色:(两种都可以) 还有一种就是在你实在想不出设置的格式的时候可以使用的:(效果是一样的) 以上就是把button用radiobutton代替,然后给它个背景: 选中跟未选中状态...
  • 喜用下面的代码根据单选按钮选择main.xml中android:orientation="vertical"android:id="@+id/LinearLayout"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="fill_parent">...