У меня есть ImageButton, который отключен (не доступен для кликов или установлен как отключенный). Я хочу дать пользовательскому интерфейсу пользователь, что он отключен без использования какого-либо другого изображения.
Есть ли способ сделать это?
У меня есть ImageButton, который отключен (не доступен для кликов или установлен как отключенный). Я хочу дать пользовательскому интерфейсу пользователь, что он отключен без использования какого-либо другого изображения.
Есть ли способ сделать это?
В отличие от обычного 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) дают вам способы программно обрабатывать изображение так, как будто оно серое.
@Олег Васкевич дал другое решение проблемы здесь: отключить кнопку 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;
}
Я предпочел переопределить метод 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);
}
}
Разрабатывая ответ @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: как сделать селектор с возможностью перемещения, чтобы также изменить фон.
Вы можете установить его без кликабельности, а также настроить альфа, чтобы показать это чувство, о котором вы упоминаете.
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)
В Kotlin вы можете использовать функции расширения.
fun ImageButton.enable() {
this.isEnabled = true
this.imageAlpha = 0xFF
}
fun ImageButton.disable() {
this.isEnabled = false
this.imageAlpha = 0x3F
}
myButton.enable()
myButton.disable()
Решение с использованием только файлов ресурсов 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). Сам оттенок - это список цветов. Установите цвета, как вам нужно, здесь серый для отключенного состояния и выделите цвет из темы для включенного состояния.
Мы меняем только цвет, и нам нужно только одно изображение для рисования. Но обратите внимание, что весь цвет кнопки будет изменен.
Используя 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 внутри; еще не пробовал, но.
Нет, ваше изображение является фактором дифференцирования. Поэтому, если вы не хотите менять изображение, то вы не можете указать, отключена ли кнопка изображения, включена, нажата.