Отключение радиообмена не "седирует" элемент управления так же, как отключать флажок. Я думал, как трудно было бы разместить полупрозрачное черное растровое изображение по всему радиоблоку, тем самым делая его темнее?
Не знаю, с чего начать, какие-нибудь идеи?
Добавление шпона на существующее изображение или чертеж лучше всего сделать с помощью ColorFilter
.
Вы можете создать две отдельные чертежи и добавить их в StateListDrawable
и предоставить отключенному графическому фильтру серого цвета. Это может стоить вам некоторой памяти, хотя, поскольку вы дублируете рисование, и похоже, что вы просто используете Android-радиоприемник Android, так что создание копии может быть больно.
Более универсальный способ сделать это - просто применить цветной фильтр всякий раз, когда View отключен. Попробуйте подклассифицировать переключатель и переопределить drawableStateChanged()
следующим образом:
@Override
public void drawableStateChanged() {
Drawable background = getBackground();
if(background != null) {
if(!isEnabled()) {
background.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
} else {
background.setColorFilter(null);
}
}
}
Edit:
Uh-oh, я вижу, что CompoundButton
имеет метод setButtonDrawable()
. Таким образом, составные кнопки не должны использовать фон как их чертежи, как обычная кнопка. И, конечно, mButtonDrawable
является частной переменной, и нет эквивалентного метода "get" - благодаря большому количеству Google. Если вы не получили доступ к нему через отражение, вам может понадобиться создать свой собственный ресурс для этого.: - (
Создание собственной выносной кнопки дает вам больше контроля над внешним видом вашего приложения, но, конечно же, это означает, что вы не будете соответствовать теме того, на каком устройстве вы работаете, плюс добавляет размер вашего приложения потому что вы в итоге добавляете к нему 8 ресурсов png. Вы могли бы попробовать переопределить onDraw()
, как вы говорили, и наложить на него какой-то полупрозрачный ColorDrawable
, но каждый раз, когда я сам пробовал это, он выглядел как полный дерьмо.
Перед тем, как спуститься по любой из этих дорог, попробуйте следующее: К счастью, доступная для переключателя кнопка отображается в общедоступном API в android.R.drawable.btn_radio
. Таким образом, вы можете раздуть это в StateListDrawable
и попытаться добавить состояния к нему как-то. Один из способов, который может работать, заключается в следующем:
StateListDrawable draw = (StateListDrawable) getResources().getDrawable(android.R.drawable.btn_radio);
Drawable radioBtnNormal = draw.getCurrent();
Drawable radioBtnDisabled = new LayerDrawable(new Drawable[]{radioBtnNormal});
radioBtnDisabled.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
draw.addState(new int[]{-android.R.attr.state_enabled}, radioBtnDisabled);
button.setButtonDrawable(draw);
Возможно, вам придется поиграть с состоянием состояния на второй линии; У меня всегда возникают проблемы с тем, чтобы государства были в порядке, чтобы он делал то, что я хочу. Также обратите внимание на отрицательный знак перед state_enabled
, который указывает на отключенное состояние.
Если это не сработает для вас, вы также можете попробовать обернуть исходный чертеж в свой собственный подкласс LayerDrawable
и переопределить метод onStateChanged
для добавления/удаления цветового фильтра на основе вашего состояния.
Я делал подобные вещи, но не эту конкретную вещь, поэтому я не знаю, будет ли это работать, но, надеюсь, я дал вам достаточно идей, чтобы вы нашли что-то, что сработает для вас!