Как я могу сделать кнопку более отзывчивой? - PullRequest
11 голосов
/ 18 февраля 2011

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

Когда я нажимаю кнопку, происходит небольшое отставание (EDIT: я бы оценил около 20-50 мс), прежде чем кнопка загорится в нажатом состоянии. Некоторым приложениям удалось устранить эту задержку, например RealCalc (доступен в Маркете), чьи кнопки переключаются в нажатое состояние сразу после нажатия на них пальцем.

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

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

РЕДАКТИРОВАТЬ: В частности, упомянутая задержка - это время, когда вы нажимаете на кнопку и удерживаете ее там до тех пор, пока кнопка не переключится в нажатое состояние. Обработчик onClick вызывается, когда вы снова убираете палец.

В некоторых ответах предлагалось перенести основную часть моего обработчика onClick в поток. Это не проблема. Чтобы удостовериться вдвойне, я удалил все обработчики кликов, и крошечная задержка все еще там.

Ответы [ 4 ]

15 голосов
/ 18 февраля 2011

Я покопался в исходном коде Android, чтобы посмотреть, что происходит.

Оказывается, что класс android.view.View (из которого происходит Button) переходит в состояние "PREPRESSED", прежде чем войти всостояние PRESSED:

android.view.View:

1529    /**
1530      * Indicates a prepressed state;
1531      * the short time between ACTION_DOWN and recognizing
1532      * a 'real' press. Prepressed is used to recognize quick taps
1533      * even when they are shorter than ViewConfiguration.getTapTimeout().
1534      * 
1535      * @hide
1536      */
1537     private static final int PREPRESSED             = 0x02000000;

android.view.ViewConfiguration.getTapTimeout () составляет 115 мс на моем Nexus One, что намного дольше, чем моя оценка.

android.view.ViewConfiguration:

67     /**
68      * Defines the duration in milliseconds we will wait to see if a touch event 
69      * is a tap or a scroll. If the user does not move within this interval, it is
70      * considered to be a tap. 
71      */
72     private static final int TAP_TIMEOUT = 115;

В любом случае, из рассмотрения View.onTouchEvent не похоже, что есть способ избежать этого состояния PREPRESSED с помощью любого стандартного параметра.Что является настоящим позором.

Хорошая новость заключается в том, что теперь я убедился, что способ избежать этого отставания - это создать подкласс и переопределить onTouchEvent.

Спасибо за обсуждение и ответы.

8 голосов
/ 04 апреля 2011

Это, кажется, исправляет:

public boolean onTouchEvent (MotionEvent event) {
   if (event.getAction() == MotionEvent.ACTION_DOWN) setPressed(true);
   return super.onTouchEvent(event);
}

Все еще не идеально, но лучше.

3 голосов
/ 09 ноября 2011

Ну ... я обычно расширяю класс Button и переопределяю метод onTouchEvent

public boolean onTouchEvent (MotionEvent event) 
{
   if (event.getAction() == MotionEvent.ACTION_DOWN) 
   {
      setPressed(true);
   }
   return super.onTouchEvent(event);
}
0 голосов
/ 18 февраля 2011

Итак, что в основном происходит в любом приложении Android, так это то, что графический интерфейс запускается в основном потоке. Если вам случится запустить другие тяжелые вещи в том же потоке, такие как общение, видео, зацикливание и т. Д., Эти действия определенно замедляют работу вашего GUI. Это случалось с моим приложением в прошлом, затем я переместил все остальные процессы в отдельный поток, и графический интерфейс стал реально реагировать в реальном времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...