如何以编程方式更改背景颜色而不影响边框?

Posted

技术标签:

【中文标题】如何以编程方式更改背景颜色而不影响边框?【英文标题】:How to change background color programatically without afftecting border? 【发布时间】:2018-05-03 06:18:12 【问题描述】:

我想创建一个带圆角的正方形,并在形状内添加背景颜色,并为其设置边框颜色,如下图所示:

但我只能做到这一点:

我有一个需要为每个圆角方框及其动态数据添加的颜色列表,以便从 API 捕获任意数量的颜色并显示在 recyclerview 上。但是当我更改布局的背景或背景颜色时,颜色出现,背景边框消失。

这是我的 xml 代码:

<RelativeLayout
    android:layout_
    android:layout_
    android:padding="5dp">
        <FrameLayout
            android:id="@+id/colorframe"
            android:layout_
            android:layout_
            android:background="@drawable/status_color_white_square"
            android:layout_centerInParent="true"
            android:onClick="@()->viewModel.onItemClick()">


            <com.monstarlab.instantmac.ui.custom.IMTextView
                android:id="@+id/captionET"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:text="A"
                android:visibility="@safeUnbox(viewModel.isSelected ? View.VISIBLE:View.GONE )" />

        </FrameLayout>
</RelativeLayout>

有边框的drawable:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:bottomRightRadius="6dp"
    android:bottomLeftRadius="6dp"
    android:topLeftRadius="6dp"
    android:topRightRadius="6dp"/>

<stroke android:
    android:color="#e8e9ea"/>

适配器视图中的 Java 代码 onBind() 方法:

        final StatusColor color = colorlist.get(position);

        statusColorViewModel = new StatusColorViewModel(color, this);

        mBinding.setViewModel(statusColorViewModel);

        mBinding.colorframe.setBackgroundColor(ContextCompat.getColor(mContext, color.getColor()));

如何在不影响边框的情况下实现颜色变化?

【问题讨论】:

您可以创建另一个drawable 文件吗? @CagriYalcin 你能详细说明一下吗? 【参考方案1】:

试试下面的代码:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:
        android:color="#000000" />//corner color
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"

        />

    <solid android:color="#8058595b" />// inside Color 

</shape>

动态更改高于纯色:

GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);

以下中风使用:

GradientDrawable myGrad = (GradientDrawable)rectangle.getBackground();
myGrad.setStroke(2, Color.RED);

【讨论】:

洛迪:谢谢。但我会动态地改变颜色。那么添加 行是否有意义? 除了这个答案,你将不得不在运行时更改这个drawable,只需创建相同的drawable并使用不同的纯色 很抱歉,但这不适用于我的自定义颜色。我尝试了以下颜色:#343434,#d3bbe8【参考方案2】:

嗨,兄弟,关注此代码

1 : xml 代码:

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

    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_centerInParent="true"
        android:background="@drawable/status_color_white_square">

        <FrameLayout
            android:id="@+id/colorframe"
            android:layout_
            android:layout_
            android:layout_centerInParent="true"
            android:layout_margin="1dp"
            android:background="@drawable/bg">

            <TextView
                android:id="@+id/captionET"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:text="A" />

        </FrameLayout>
    </RelativeLayout>

</RelativeLayout>

2 :可绘制对象: 一)bg.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners
        android:bottomLeftRadius="6dp"
        android:bottomRightRadius="6dp"
        android:topLeftRadius="6dp"
        android:topRightRadius="6dp" />

    <solid android:color="#cf0000"/>

</shape>

二)bg.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners
        android:bottomLeftRadius="6dp"
        android:bottomRightRadius="6dp"
        android:topLeftRadius="6dp"
        android:topRightRadius="6dp" />

    <stroke
        android:
        android:color="#e8e9ea" />
</shape>

3:Java 代码

import android.content.res.ColorStateList;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.FrameLayout;

public class Temp extends AppCompatActivity 


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.temp);


        FrameLayout colorframe = (FrameLayout) findViewById(R.id.colorframe);



        ViewCompat.setBackgroundTintList(
                colorframe,
                ColorStateList.valueOf(/*dynamic color enter here*/getResources().getColor(R.color.green)));
    

【讨论】:

非常感谢。但它不起作用。我在可绘制对象上应用了蓝色【参考方案3】:

这也可以通过将文本放置在中心来创建相对布局和文本视图来实现。使用可绘制资源文件为布局应用背景属性。

main_activity.xml

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_
        android:layout_
        android:background="#3F51B5">
    <RelativeLayout
        android:layout_
        android:layout_
        android:background="@drawable/border">
        <TextView
            android:layout_
            android:layout_
            android:text="Google"
            android:id="@+id/txt_google"
            android:layout_centerInParent="true"
            android:textStyle="bold"
            android:textColor="@color/colorAccent"/>
    </RelativeLayout>
    </LinearLayout>

Create drawable resource border.xml and put the below shape and stoke properties



   <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <corners android:bottomRightRadius="6dp"
            android:bottomLeftRadius="6dp"
            android:topLeftRadius="6dp"
            android:topRightRadius="6dp"/>
        <solid
            android:color="@android:color/darker_gray">
        </solid>
        <stroke android:
            android:color="@color/colorAccent"/></shape>

【讨论】:

以上是关于如何以编程方式更改背景颜色而不影响边框?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改应用小部件背景颜色

UITextField 边框颜色

如何在 Swift 中以编程方式更改自定义 UITableViewCell 中按钮的背景颜色?

当我设置自定义边框或背景颜色时,为什么Firefox在选择箭头按钮上设置背景颜色?

如何以编程方式圆角并设置随机背景颜色

如何以编程方式设置 UINavigationbar 的背景颜色?