Android - автоматическое оверлейное касание вниз/выделенное состояние изображения

Можно ли использовать ImageButton для прикосновения и выделения состояний без необходимости еще двух ресурсов изображения на Android (еще 6, учитывая h/m/ldpi)? Я в основном ищу поведение, подобное iOS, где ОС может помещать полу-альфа-оверлей в состояние нажатия кнопки.

Я пробовал использовать setColorFilter(0xFF000000, Mode.MULTIPLY) в прослушивателе onTouch, и результат был довольно близок к тому, что я был после, но я не уверен, что лучший способ обработки состояния для этого:

то есть.

  • событие touchDown → Изменить наложение цвета.
  • touchUp event → удалить наложение цвета и выполнить действие кнопки.

Есть ли лучший способ... Или может кто-то помочь заполнить пробелы?

Я не хочу использовать отдельные изображения по нескольким причинам - это порт iPhone, для которого у меня пока нет соответствующих ресурсов, и потребуется больше времени дизайнера, учитывая, что у меня низкий/средний/Высокие объявления для обсуждения.

Спасибо!

Ответ 1

Если вы довольны setColorFilter(0xFF000000, Mode.MULTIPLY), то как создать пользовательский компонент, который расширяет ImageButton?

Что-то вроде:

(Извините, у меня не было возможности проверить это)

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;

public class IosImageButton extends ImageButton implements OnTouchListener
{

    public IosImageButton(final Context context, final AttributeSet attrs, final int defStyle)
    {
        super(context, attrs, defStyle);
        this.init();
    }

    public IosImageButton(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);
        this.init();
    }

    public IosImageButton(final Context context)
    {
        super(context);
        this.init();
    }

    private void init()
    {
        super.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(final View view, final MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                // touchDown event -> Change color overlay. goes here
                // e.g. this.setColorFilter(0xFF000000, Mode.MULTIPLY);
                return true;

            case MotionEvent.ACTION_UP:
                // touchUp event -> remove color overlay, and perform button action.
                // e.g. this.setColorFilter(0xFF000000, Mode.MULTIPLY);
                return true;

            default:
                return false;
        }
    }
}

Затем view.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.example.IosImageButton 
        <!-- add standard ImageButton setting here -->
        />

</RelativeLayout>

Ответ 2

Не используйте события касания, чтобы попытаться показать соответствующие состояния на что-то вроде этого. Вы неизбежно получите это частично неправильно. Рамка выполняет большую работу по обнаружению намерений пользователя (например, пользователь коснулся, но затем соскользнул с пальца), принимая во внимание такие вещи, как slop и т.д.

Для ImageButton вы можете использовать атрибут src для отображения значка, а затем использовать StateListDrawable в качестве фона.

Я создал быстрый проект, чтобы вы могли видеть в Github

Обратите внимание, что состояния касания отображаются в фоновом режиме, а не на переднем плане. См. Обсуждение в Google+ о том, почему разработчики фреймворка Android считают, что обратная связь с сенсорным экраном должна быть позади, а не спереди. Если вы все еще хотите, чтобы выталкиваемый был впереди, см. Мой пост в моем блоге