Android: как «отключить» радиопереключатель

1

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

Не знаю, с чего начать, какие-нибудь идеи?

Теги:

1 ответ

3

Добавление шпона на существующее изображение или чертеж лучше всего сделать с помощью 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 для добавления/удаления цветового фильтра на основе вашего состояния.

Я делал подобные вещи, но не эту конкретную вещь, поэтому я не знаю, будет ли это работать, но, надеюсь, я дал вам достаточно идей, чтобы вы нашли что-то, что сработает для вас!

  • 0
    Приветствия Нил. Я пробовал это, но это не имеет никакого эффекта. Я добавил следующую строку в качестве первой строки процедуры, так как без нее не было показано, какие из них были нажаты: super.drawableStateChanged (); Мой код вызывался для обоих значений isEnabled, но между ними не было никакой разницы в отображении. Я также попробовал setBackgroundColor на весь вид, но это тоже не сработало. Я использую стандартные элементы управления черным фоном, это будет иметь значение?
  • 0
    Хорошо, я только что понял, что не использует фон, а скорее рисует саму кнопку. Я отредактировал свой пост, чтобы предложить некоторые обходные пути для этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню