Как программно изменить цвет фона, не ограничивая границы? - PullRequest
0 голосов
/ 03 мая 2018

Я хотел бы создать квадрат со скругленными углами, добавить цвет фона внутри фигуры и придать ему цвет границы, как показано на следующем рисунке:

Expected design

Но я могу достичь этого только:

Result

У меня есть список цветов, которые необходимо добавить для каждого из квадратов с закругленными углами и его динамических данных, чтобы любое количество цветов было получено из API и отображено в представлении реселлера. Но когда я изменяю фон или цвет фона макета, появляется цвет, и граница фона исчезает.

Вот мой код для xml:

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp">
        <FrameLayout
            android:id="@+id/colorframe"
            android:layout_width="72dp"
            android:layout_height="72dp"
            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_width="wrap_content"
                android:layout_height="wrap_content"
                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:width="1dp"
    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()));

Как мне добиться изменения цвета, не затрагивая границы?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

привет, братан, следуя этому коду

1: код для xml:

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

    <RelativeLayout
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:layout_centerInParent="true"
        android:background="@drawable/status_color_white_square">

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

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

        </FrameLayout>
    </RelativeLayout>

</RelativeLayout>

2: Drawable: I) 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>

II) 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:width="1dp"
        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)));
    }
}
0 голосов
/ 03 мая 2018

Этого также можно добиться, создав в нем относительный макет и вид текста, поместив текст по центру. Примените свойство background для макета, используя файл ресурсов для рисования.

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_width="match_parent"
        android:layout_height="match_parent"
        android:background="#3F51B5">
    <RelativeLayout
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@drawable/border">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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:width="1dp"
            android:color="@color/colorAccent"/></shape>
0 голосов
/ 03 мая 2018

Попробуйте ниже код:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="1dp"
        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);
...