у меня есть
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#FFFF00" />
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
</shape>
<TextView
android:background="@drawable/test"
android:layout_height="45dp"
android:layout_width="100dp"
android:text="Moderate"
/>
Итак, теперь я хочу, чтобы эта форма меняла цвета в зависимости от информации, которую я получаю от вызова веб-службы. Так что он может быть желтым, зеленым, красным или каким-то другим, в зависимости от цвета, который я получаю от вызова веб-службы.
Как изменить цвет фигуры? На основании этой информации?
View.getBackground()
возвращает,GradientDrawable
а неShapeDrawable
вызывает сбой приложения во время выполнения из-за недопустимого приведения при попытке получить ссылку и программно установить цвет. [ Документ Android Shape] ( developer.android.com/guide/topics/resources/… ) заявляет: COMPILED RESOURCE DATATYPE: указатель ресурса на файлGradientDrawable
.Ответы:
Вы можете изменить это просто так
источник
java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawable
при попытке это предложение.Для меня он разбился, потому что
getBackground
вернулGradientDrawable
вместоShapeDrawable
.Итак, я изменил это так:
((GradientDrawable)someView.getBackground()).setColor(someColor);
источник
Это работает для меня с исходным xml-ресурсом:
example.setBackgroundResource(R.drawable.myshape); GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent(); gd.setColor(Color.parseColor("#000000")); gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30}); gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);
Результат вышеуказанного: http://i.stack.imgur.com/hKUR7.png
источник
Вы можете создавать свои собственные формы на Java. Я сделал это для iPhone, например Page Controler, и нарисовал формы на Java:
/** * Builds the active and inactive shapes / drawables for the page control */ private void makeShapes() { activeDrawable = new ShapeDrawable(); inactiveDrawable = new ShapeDrawable(); activeDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize, (int) mIndicatorSize); int i[] = new int[2]; i[0] = android.R.attr.textColorSecondary; i[1] = android.R.attr.textColorSecondaryInverse; TypedArray a = this.getTheme().obtainStyledAttributes(i); Shape s1 = new OvalShape(); s1.resize(mIndicatorSize, mIndicatorSize); Shape s2 = new OvalShape(); s2.resize(mIndicatorSize, mIndicatorSize); ((ShapeDrawable) activeDrawable).getPaint().setColor( a.getColor(0, Color.DKGRAY)); ((ShapeDrawable) inactiveDrawable).getPaint().setColor( a.getColor(1, Color.LTGRAY)); ((ShapeDrawable) activeDrawable).setShape(s1); ((ShapeDrawable) inactiveDrawable).setShape(s2); }
надеюсь это поможет. Гриз Фабиан
источник
Возможно, кому-то еще нужно изменить цвет в XML без создания нескольких чертежей, как мне было нужно. Затем сделайте круг рисованным без цвета, а затем укажите backgroundTint для ImageView.
circle.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> </shape>
И в вашем макете :
<ImageView android:layout_width="50dp" android:layout_height="50dp" android:background="@drawable/circle" android:backgroundTint="@color/red"/>
Редактировать:
В этом методе есть ошибка, которая не позволяет ему работать на Android Lollipop 5.0 (уровень API 21). Но были исправлены в более новых версиях.
источник
LayerDrawable bgDrawable = (LayerDrawable) button.getBackground(); final GradientDrawable shape = (GradientDrawable) bgDrawable.findDrawableByLayerId(R.id.round_button_shape); shape.setColor(Color.BLACK);
источник
circle.xml (рисованный)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#000"/> <size android:width="10dp" android:height="10dp"/> </shape>
макет
<ImageView android:id="@+id/circleColor" android:layout_width="15dp" android:layout_height="15dp" android:textSize="12dp" android:layout_gravity="center" android:layout_marginLeft="10dp" android:background="@drawable/circle"/>
в действии
circleColor = (ImageView) view.findViewById(R.id.circleColor); int color = Color.parseColor("#00FFFF"); ((GradientDrawable)circleColor.getBackground()).setColor(color);
источник
Это решение сработало для меня с использованием android sdk v19:
//get the image button by id ImageButton myImg = (ImageButton) findViewById(R.id.some_id); //get drawable from image button GradientDrawable drawable = (GradientDrawable) myImg.getDrawable(); //set color as integer //can use Color.parseColor(color) if color is a string drawable.setColor(color)
источник
Если у вас есть такой imageView:
<ImageView android:id="@+id/color_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:src="@drawable/circle_color"/>
которые придают ему форму, которую можно рисовать как src, вы можете использовать этот код для изменения цвета формы:
источник
Моя форма xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/transparent" /> <stroke android:width="0.5dp" android:color="@android:color/holo_green_dark"/> </shape>
Моя активность xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="cn.easydone.test.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <TextView android:id="@+id/test_text" android:background="@drawable/bg_stroke_dynamic_color" android:padding="20dp" android:text="asdasdasdasd" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior" />
Моя активность java:
TextView testText = (TextView) findViewById(R.id.test_text); ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);
Картинка результата : результат
источник
Самый простой способ заполнить форму радиусом :
XML:
<TextView android:id="@+id/textView" android:background="@drawable/test" android:layout_height="45dp" android:layout_width="100dp" android:text="Moderate"/>
Ява:
(textView.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
источник
Я пытаюсь ответить Ронни, и мое приложение разбилось. Затем я проверяю свой файл xml. Выглядит это так:
<selector >...</selector>
. Я изменил его на это: (также изменил атрибуты)
<shape> ... </shape>
Оно работает.
Для тех, кто сталкивается с такой же проблемой.
источник
drawable_rectangle.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/transparent" /> <stroke android:width="1dp" android:color="#9f9f9f" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape>
TextView
<androidx.appcompat.widget.AppCompatTextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/drawable_rectangle" android:gravity="center" android:padding="10dp" android:text="Status" android:textColor="@android:color/white" android:textSize="20sp" /> public static void changeRectangleColor(View view, int color) { ((GradientDrawable) view.getBackground()).setStroke(1, color); } changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));
источник
Для этого можно использовать адаптер привязки (Kotlin) . Создайте класс адаптера привязки с именем ChangeShapeColor, как показано ниже.
@BindingAdapter("shapeColor") // Method to load shape and set its color fun loadShape(textView: TextView, color: String) { // first get the drawable that you created for the shape val mDrawable = ContextCompat.getDrawable(textView.context, R.drawable.language_image_bg) val shape = mDrawable as (GradientDrawable) // use parse color method to parse #34444 to the int shape.setColor(Color.parseColor(color)) }
Создайте фигуру, которую можно рисовать, в папке res / drawable. Я создал круг
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="#anyColorCode"/> <size android:width="@dimen/dp_16" android:height="@dimen/dp_16"/> </shape>
Наконец, обратитесь к своему мнению
<TextView> ......... app:shapeColor="@{modelName.colorString}" </Textview>
источник