Подтвердить что ты не робот

Android ImageButton с отключенным интерфейсом

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

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

4b9b3361

Ответ 1

В отличие от обычного 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 или @southerton's) дают вам способы программно обрабатывать изображение так, как будто оно серое.

Ответ 2

@Олег Васкевич дал другое решение проблемы здесь: отключить кнопку 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 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 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;
}

Ответ 3

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

public class CustomImageButton extends ImageButton {
    //...

    @Override
    public void setEnabled(boolean enabled) {
        if(this.isEnabled() != enabled) {
            this.setImageAlpha(enabled ? 0xFF : 0x3F);
        }
        super.setEnabled(enabled);
    }
}

Ответ 4

Разрабатывая ответ @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: как сделать селектор с возможностью перемещения, чтобы также изменить фон.

Ответ 5

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

Ответ 6

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)

Ответ 7

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

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

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

myButton.enable()
myButton.disable()

Ответ 8

Решение с использованием только файлов ресурсов 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). Сам оттенок - это список цветов. Установите цвета, как вам нужно, здесь серый для отключенного состояния и выделите цвет из темы для включенного состояния.
Мы меняем только цвет, и нам нужно только одно изображение для рисования. Но обратите внимание, что весь цвет кнопки будет изменен.

Ответ 9

Используя 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 внутри; еще не пробовал, но.

Ответ 10

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