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

Как изменить оттенок ImageButton на фокусе/нажмите

У меня есть ImageButton в моем приложении, и мне нужно изменить оттенок изображения, когда кнопка pressed/focused. У меня есть параметр ImageButton, чтобы получить его src из XML файла, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- pressed -->
    <item 
        android:state_pressed="true"
        android:tint="@color/black"
        android:drawable="@drawable/search"
        />

    <!-- focused -->
    <item 
        android:state_focused="true"
        android:tint="@color/black"
        android:drawable="@drawable/search"
        />

    <!-- default -->
    <item
        android:tint="@null"
        android:drawable="@drawable/search"
        />

</selector>

Однако оттенок не применяется, когда нажата или сфокусирована кнопка ImageButton - изображение отображается как обычно. Цвет черный определяется как #000000, как всегда. Любые идеи?

4b9b3361

Ответ 1

Вы можете легко изменить оттенок, используя код:

ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify);
button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

Надеюсь, что это поможет.

JS

Ответ 2

Вот как это сделать, используя только XML. В вашей папке drawable создайте селектор. Например: touch_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
    <item android:state_pressed="true" android:color="@color/semi_slate" />

    <!-- When the view is "activated".  In SINGLE_CHOICE_MODE, it flags the active row
     of a ListView -->
    <item android:state_activated="true" android:color="@color/semi_slate" />

    <!-- Default, "just hangin' out" state. -->
    <item android:color="@android:color/transparent" />
</selector>

В моем представлении изображения в xml я установил атрибут android: tint для рисования, созданного выше.

android:tint = "@drawable/touch_selector"

Весь код выглядел так:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/poster"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:tint="@drawable/touch_selector" />

Это полностью XML-решение для нанесения оттенка на ImageView при печати или при активном. Подобное можно сделать для ImageButton

Обратите внимание, что это работает только для уровня API> = 21.

Ответ 3

Я нашел способ сделать это в xml (в api 21 и по крайней мере).

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <bitmap
            android:src="@drawable/search"
            android:tint="@color/black"
            />
    </item>
    <item android:drawable="@drawable/search"/>
</selector>

Установив оттенок на растровое изображение, можно повторно использовать один и тот же drawable в xml без необходимости перехватывать штрихи или подкласс ImageView или ImageButton.

Как только селектор был создан, просто примените его как src ImageView или ImageButton.

Ответ 4

Наконец, я нашел решение для API <21:

Button more = (Button) findViewById(R.id.more);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    more.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
} else {
    Drawable wrapDrawable = DrawableCompat.wrap(more.getBackground());
    DrawableCompat.setTint(wrapDrawable, color));
    more.setBackgroundDrawable(DrawableCompat.unwrap(wrapDrawable));
}

Пусть это поможет кому-то не потерять 2 часа!

Ответ 5

bt.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        bt.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
                        return true; // if you want to handle the touch event
                    case MotionEvent.ACTION_UP:
                        bt.clearColorFilter(); // White Tint
                        return true; // if you want to handle the touch event
                }
                return false;
            }
        });

Ответ 6

Что я делаю, так это добавить пользовательскую кнопку с функцией setColorFilter.

Подобным образом я могу использовать новую кнопку в xml.

public class CustomButton extends Button {

public CustomButton(Context context) {
    super(context);
}

public CustomButton(Context context, AttributeSet attributes) {
    super(context, attributes);
};

@Override
public boolean onTouchEvent(MotionEvent event) {
    int maskedAction = event.getActionMasked();
    if (maskedAction == MotionEvent.ACTION_DOWN)
        getBackground().setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
    else if (maskedAction == MotionEvent.ACTION_UP)
        getBackground().setColorFilter(null);
    return super.onTouchEvent(event);
}}

и для ImageButton

public class CustomImageButton extends ImageButton {

public CustomImageButton(Context context) {
    super(context);
}

public CustomImageButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int maskedAction = event.getActionMasked();
    if (maskedAction == MotionEvent.ACTION_DOWN)
        setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
    else if (maskedAction == MotionEvent.ACTION_UP)
        setColorFilter(null);
    return super.onTouchEvent(event);
}}

Ответ 7

Я заметил, что здесь есть несколько запросов для людей, желающих узнать, как это сделать в XML. На самом деле это довольно просто. Это может быть выполнено с помощью layer-list

Ваша кнопка доступна (drawable/some_button.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/some_button_highlighted" />
    <item android:drawable="@drawable/some_button_image" />
</selector>

И это выделенное drawable (drawable/some_button_highlighted.xml)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/some_button_image"/>
    <item>
        <shape>
            <solid android:color="@color/highlighted_button_color" />
        </shape>
    </item>
</layer-list>

Теперь вы можете использовать это в любом другом xml:

...
android:drawable="@drawable/some_button"
...

Я надеюсь, что это поможет кому-то в будущем.

Ответ 8

Вы можете установить цвет (оттенок) из xml.

Установите transparent (android:background="@null") для background, затем используйте tint:

<ImageButton
     android:layout_width="wrap_content"
     android:layout_height="fill_parent"
     android:tint="@color/Amber_200"
     android:background="@null"
     android:src="@drawable/back_selector" />

Ответ 9

Как вы определили селектор как src в ImageButton Android, AFAIK просто возьмет выделение, потому что это соответствует типу src. Таким образом, оттенок не будет использоваться.

Тем не менее, у меня была аналогичная проблема: я также попытался использовать селектор, как ваш, но для android: значение оттенка ImageButton вместо android: src. Конечно, я опустил значения оттенков, которые у вас есть в вашем селекторе. Это также решит вашу проблему, потому что вы хотите использовать один и тот же шаблон для всех состояний. Любопытно, что я получаю NumberFormatException каждый раз, заявляя, что системе не удалось разобрать "res/color/tint_selector.xml" (который действительно мой селектор) как целое. Чтобы быть конкретным, мой код выглядит следующим образом:

Это мой селектор, сохраненный в /res/color/tint _selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_pressed="true"
         android:color="#D3D3D3"/> <!-- pressed -->
   <item android:color="#ff000000"/> <!-- default -->
</selector>

И это соответствующий ImageButton:

<ImageButton android:id="@+id/program_help"
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content"
     android:src="@drawable/symbol"
     android:tint="@color/tint_selector">
</ImageButton>

Возможно, это немного помогает, хотя в настоящее время оно не работает.