Установить цвет формы программно

63
5

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#80B3B3B3"/>
<corners android:bottomRightRadius="2dp" android:bottomLeftRadius="2dp"
android:topLeftRadius="2dp" android:topRightRadius="2dp"/>
</shape>

Затем я перезаписываю свой метод onDraw для Keyboard View:

@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
List<Key> keys = getKeyboard().getKeys();
for (Key key : keys) {
Drawable dr = (Drawable)this.getResources().getDrawable(R.drawable.keyshape);
dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
dr.draw(canvas);
}
}

Теперь я хочу, чтобы этот пользователь задал этот цвет Shape какой-либо идеи, как я могу установить это перед рисованием?

спросил(а) 2021-01-25T16:10:07+03:00 5 месяцев назад
1
Решение
63

Прежде всего, вы должны сделать настраиваемый вид, который вы хотите установить и расширить (TextView или Button w/e. Я напишу образец как расширяющий View), так как вы не можете программно изменить форму xml, вы создадите ее как все.

Переопределите необходимое поведение и конструкторы для вашего представления. Теперь вы создадите метод setGradientColors, который принимает два цвета как значения int (цвета нижнего и верхнего градиента). Вы можете изменить его для установки радиуса для закругленных углов.

public class GradientView extends View{

public GradientView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public GradientView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public GradientView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public void setGradientColors(int bottomColor, int topColor) {
GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[] {bottomColor, topColor});
gradient.setShape(GradientDrawable.RECTANGLE);
gradient.setCornerRadius(10.f);
this.setBackgroundDrawable(gradient);
}

}

Вы собираетесь использовать это новое представление и задать форму программно следующим образом:

GradientView view = (GradientView) findViewById(R.id.customView);
// bottom color - top color order
view.setGradientColors(Color.parseColor("#ff0000"), Color.parseColor("#0000ff"));

Если вам нужна дополнительная помощь и полное объяснение основ, я достиг этого в своем проекте, следуя этой ссылке

Надеюсь, это поможет вам.

ответил(а) 2021-01-25T16:10:07+03:00 5 месяцев назад
45

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

imageView.getBackground().setColorFilter(Color.parseColor("#BBBDBF"), Mode.MULTIPLY);
imageview.invalidate();

он будет умножать данный цветовой код на ваш фоновый рисунок изображения и покажет эффект изменения цвета.

ответил(а) 2021-01-25T16:10:07+03:00 5 месяцев назад
45

Если вы хотите изменить только цвета на фигуре из xml drawable, я немного изменил свой onDraw, чтобы сделать это. Это будет GradientDrawable, если вы определяете его в xml с <shape>.


        Drawable dr = this.getResources().getDrawable(R.drawable.keyshape);
if (dr instanceof GradientDrawable) {
GradientDrawable gradientDr = (GradientDrawable) dr;
gradientDr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
gradientDr.setColor(Color.GREEN);
gradientDr.draw(canvas);
}

ответил(а) 2021-01-25T16:10:07+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема