Android ImageButton с отключенным интерфейсом - PullRequest
39 голосов
/ 29 августа 2011

У меня есть кнопка ImageButton, которая отключена (не активируется или не активируется).Я хочу, чтобы пользовательский интерфейс чувствовал, что он отключен без использования других изображений.

Есть ли способ сделать это?

Ответы [ 10 ]

56 голосов
/ 29 августа 2011

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

Если с другим изображением все в порядке, вы можете сделать это с помощью <selector> (здесь это связано с обычным Button, но это относится к тому же):

  • /drawable/my_selector.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_enabled="false"
            android:drawable="@drawable/button_gray" /> ***button_gray is a Drawable image***
        <item android:state_pressed="true"
            android:drawable="@drawable/button_gray" /> 
        <item android:drawable="@drawable/button_red" /> ***button_red is a Drawable image*** 
    </selector>
    

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

  • Ваш layout.xml:

    <Button android:id="@+id/myButton"
            android:background="@drawable/my_selector" ***this is a reference to the selector above ***
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
    />
    

И если использование другого изображения будет проблемой, другие ответы (например, @ Tronman's или @ southerton's) дают вам возможность программно обработать изображение так, чтобы оно выглядело серым.

34 голосов
/ 14 июня 2013

@ Олег Васкевич дал другое решение проблемы здесь: Отключить кнопку ImageButton

Его решение позволяет вам выделять ImageButton серым цветом без создания дополнительных изображений или использования <selector>.

/**
 * Sets the image button to the given state and grays-out the icon.
 * 
 * @param ctxt The context
 * @param enabled The state of the button
 * @param item The button item to modify
 * @param iconResId The button's icon ID
 */
public static void setImageButtonEnabled(Context ctxt, boolean enabled, 
        ImageButton item, int iconResId) {

    item.setEnabled(enabled);
    Drawable originalIcon = ctxt.getResources().getDrawable(iconResId);
    Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon);
    item.setImageDrawable(icon);
}

/**
 * Mutates and applies a filter that converts the given drawable to a Gray
 * image. This method may be used to simulate the color of disable icons in
 * Honeycomb's ActionBar.
 * 
 * @return a mutated version of the given drawable with a color filter applied.
 */
public static Drawable convertDrawableToGrayScale(Drawable drawable) {
    if (drawable == null) 
        return null;

    Drawable res = drawable.mutate();
    res.setColorFilter(Color.GRAY, Mode.SRC_IN);
    return res;
}
9 голосов
/ 22 июня 2017

Я предпочел переопределить метод setEnabled() в ImageButton, чтобы соответственно изменить альфа-свойство изображения.Поэтому, когда кнопка отключена, изображение будет частично прозрачным и будет выглядеть более неработающим.

public class CustomImageButton extends ImageButton {
    //...

    @Override
    public void setEnabled(boolean enabled) {
        if(this.isEnabled() != enabled) {
            this.setImageAlpha(enabled ? 0xFF : 0x3F);
        }
        super.setEnabled(enabled);
    }
}
7 голосов
/ 05 сентября 2015

Обрабатывая ответ @tronman, вы также можете составить функцию, которая будет выделять серым цветом динамически загружаемые рисованные объекты (т.е. не из ресурсов, например загружаемые из необработанных файлов SVG и конвертируемые в BitmapDrawables на лету).

/**
 * Sets the specified image buttonto the given state, while modifying or
 * "graying-out" the icon as well
 *
 * @param enabled The state of the menu item
 * @param item The menu item to modify
 * @param originalIcon The drawable
 */
public static void setImageButtonEnabled(Context ctxt, boolean enabled, ImageButton item, Drawable originalIcon) {
    item.setEnabled(enabled);

    Drawable res = originalIcon.mutate();
    if (enabled)
        res.setColorFilter(null);
    else
        res.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
}

Если у вас также есть непрозрачное рисование на фоне (задано с помощью android: background), обратитесь к селекторам Android: Как сделать селектор рисования , чтобы также изменить фон.

3 голосов
/ 05 января 2013

Вы можете установить его как не активируемый щелчком мыши, а также установить альфу, чтобы показать то чувство, которое вы упомянули.

1 голос
/ 04 июня 2019

Решение с использованием только файлов ресурсов xml:

    <ImageButton
        style="@style/your-style"
        android:tint="@color/but_color"
        android:src="@drawable/button" />

и ресурса цвета but_color (в папке res / color):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#888" />
    <item android:color="?android:attr/colorAccent" />
</selector>

То есть мы устанавливаем оттенок цветакнопка (отлично работает на каждой версии Android, если используется библиотека поддержки AndroidX).Сам оттенок - это список цветов.Установите нужные цвета: серый для отключенного состояния и акцентирующий цвет для темы для включенного состояния.
Мы меняем только цвет и нам нужно только одно изображение для рисования.Но обратите внимание, что весь цвет кнопки будет изменен.

0 голосов
/ 15 июня 2019

Используя setImageAlpha на ImageButton, это можно сделать

При включении

 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(true);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0xFF);

при отключении,

 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(false);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0x3F);

Как @SnoopDougg предложил, пользовательский класс ImageButton может быть хорошей идеей, расширяя ImageButton и устанавливая ImageAlpha внутри; еще не пробовал, но.

0 голосов
/ 13 марта 2019

В Kotlin вы можете использовать функции расширения.

fun ImageButton.enable() {
    this.isEnabled = true
    this.imageAlpha = 0xFF
}

fun ImageButton.disable() {
    this.isEnabled = false
    this.imageAlpha = 0x3F
}

myButton.enable()
myButton.disable()
0 голосов
/ 08 марта 2018
public static void setImageButtonEnabled(@NonNull final ImageView imageView,
                                         final boolean enabled) {
    imageView.setEnabled(enabled);
    imageView.setAlpha(enabled ? 1.0f : 0.3f);

    final Drawable originalIcon = imageView.getDrawable();
    final Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon);
    imageView.setImageDrawable(icon);
}

private static Drawable convertDrawableToGrayScale(@NonNull Drawable drawable) {
    final ColorMatrix matrix = new ColorMatrix();
    matrix.setSaturation(0);
    final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

    final Drawable mutated = drawable.mutate();
    mutated.setColorFilter(filter);

    return mutated;
}

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

fun ImageView.setImageButtonEnabled(enabled: Boolean){
   //Above implementation here
}

и позвоните, используя:

yourImageView.setImageButtonEnabled(true/false)
0 голосов
/ 29 августа 2011

Нет, ваше изображение является дифференцирующим фактором .. поэтому, если вы не хотите менять изображение, вы не можете сказать, отключена ли кнопка изображения, включена, нажата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...