Как программно изменить цвет фона, не ограничивая границы?
Я хотел бы создать квадрат со скругленными углами, добавить цвет фона внутри фигуры и придать ему цвет границы, как на следующем изображении:
Но я могу достичь этого только:
У меня есть список цветов, которые необходимо добавить для каждого из квадратов с закругленными углами и его динамических данных, чтобы любое количество цветов было получено из 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 ответа
Попробуйте ниже код:
<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);
Это также может быть достигнуто путем создания относительного макета и представления текста в нем, поместив текст в центре. Примените свойство 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>
Привет братан, следуя этому коду
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)));
}
}