Как изменить цвет рисованной фигуры в файле макета

Я создал круговую форму. Я использую это в качестве фона для моей линейной компоновки. Он работает нормально. Но проблема в том, что я хочу создать 6 кругов с разными цветами. Так можно ли использовать только одну форму и изменить ее цвет для разных кругов?

Это моя круглая круглая форма

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@color/colorPrimary" /> <size android:width="30dp" android:height="30dp"/> </shape> 

Я хочу создать этот макет, используя круговую форму с различными цветами.

расположение: Введите описание изображения здесь

Solutions Collecting From Web of "Как изменить цвет рисованной фигуры в файле макета"

Хотя ответ @AbAppletic хорош, я хочу добавить еще один способ решить проблему. Вы можете определить круг в java, а затем использовать это представление несколько раз в своих xml-макетах и ​​изменить их цвет по своему усмотрению. Вид круга:

 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class Circle extends View { Paint p; int color ; public Circle(Context context) { this(context, null); } public Circle(Context context, AttributeSet attrs) { this(context, attrs, 0); } public Circle(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // real work here TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.Circle, 0, 0 ); try { color = a.getColor(R.styleable.Circle_circleColor, 0xff000000); } finally { // release the TypedArray so that it can be reused. a.recycle(); } init(); } public void init() { p = new Paint(); p.setColor(color); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); if(canvas!=null) { canvas.drawCircle(getHeight()/2, getWidth()/2,getWidth()/2,p ); } } } 

Добавьте эти строки в attrs.xml :

 <declare-styleable name="Circle"> <attr name="circleRadius" format="integer"/> <attr name="circleColor" format="color" /> </declare-styleable> 

И затем вы можете использовать этот вид в своем макете несколько раз, также вы можете изменить их фон:

 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TableRow android:gravity="center"> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color1" /> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv2" android:layout_width="120dp" android:layout_height="120dp" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color2" /> </TableRow> <TableRow android:gravity="center"> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv3" android:layout_width="120dp" android:layout_height="120dp" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color3" /> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv4" android:layout_width="120dp" android:layout_height="120dp" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color4" /> </TableRow> <TableRow android:gravity="center"> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv5" android:layout_width="120dp" android:layout_height="120dp" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color5" /> <com.afranet.broadbandportal.view.Circle xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cv6" android:layout_width="120dp" android:layout_height="120dp" android:layout_margin="5dp" android:background="@color/colorPrimary" app:circleColor="@color/color6" /> </TableRow> 

Вот скриншот: Введите описание изображения здесь

Вы можете, установив для всех кнопок все те же самые доступные (то, что вы предоставили), а затем в свой код:

Пример:

 Drawable mDrawable = ContextCompat.getDrawable(context, R.drawable.yourDrawable); mDrawable.setColorFilter(new PorterDuffColorFilter(yourColorInt,PorterDuff.Mode.MULTIPLY)); final int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { yourButton.setBackgroundDrawable(mDrawable); } else { yourButton.setBackground(mDrawable); } 

Сделайте это для каждой из ваших кнопок, но не забудьте заменить yourColorInt цветом, который yourColorInt для кнопки, к которой вы ее применяете.