Android - автоматическое наложение касания / выделенного состояния кнопки изображения - PullRequest
11 голосов
/ 03 апреля 2011

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

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

т.е.

  1. событие touchDown -> Изменить наложение цвета.
  2. событие touchUp -> удалить наложение цвета и выполнить действие кнопки.

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 июня 2013

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

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

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

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

1 голос
/ 10 марта 2013

Если вы довольны 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>
...