Как ускорить реакцию на нажатие ссылок в WebView под Android

Приветствую всех Хабровчан!

Излагаю суть проблемы: есть приложение на Андроид — его суть — просто обертка вокруг WebView.
Весь функционал вынесен в PHP (на сервере) и JavaScript (на клиентских страницах).
Основная цель — на страницах много кнопок, которые пользователь может включать/выключать, тыча в них пальчиком (они при этом просто меняют цвет фона). Кнопки выполнены в виде ссылок, для которых в CSS заданы размеры, display: block, float: left, и т.п. (При попытке использовать обычные кнопки — <input type=«button»… /> — результат не меняется)

Так вот, при нажатии на кнопку (ссылку) смартфон делает паузу (где-то 300-400 мс), затем издает короткий звук нажатия, затем подсвечивает кнопку оранжевой рамкой и убирает ее (рамку). На все это уходит почти секунда (может и немного меньше, но все равно это ужасно мешает). Кнопок в окне много, нажимать их нужно быстро.

Можно ли избавиться от данной паузы и, возможно, эффекта подсветки?

Можно, конечно, сделать подсветку прозрачной, плюс прочие шаманства:
a, a:hover, input, textarea {
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
-webkit-user-select: none;
}

body {
-webkit-text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
-webkit-user-select: none;
}


Но время на ее прорисовку и убирание все равно тратится! Да еще и эта пауза перед звуком и подсветкой!

Стандартные кнопки в самом Android-приложении работают быстро. Но писать весь функционал на Java пока нереально (в силу недостаточного опыта программирования на Java). А вот на JavaScript + PHP + MySQL пишу свободно и все что угодно. Поэтому и был выбран такой путь.

В общем, если кто знает, чего нужно покрутить в WebView или WebSettings, чтобы уменьшить время прорисовки «финтифлюшек» при нажатии ссылки на странице, загруженной в компонент — буду очень признателен.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 19

    0
    Используйте не onClick а onTouch.
    Также замечал странные тормоза со ссылками, появлялись при использовании каких-то конкретных стилей, что-то вроде цвета или цвета бекграунда, я тогда так до конца и не разобрался.
      0
      Как было сказано выше, вместо события click используйте событие touchend.
      Естественно, надо проверять в touchend, не было ли между touchstart и touchend события touchmove, чтобы не возникло ситуации, когда скроллинг контента будет расцениваться как нажатие.
        0
        А чтобы не заморачиваться на отлавливание touchmove между touchstart и touchend советую использовать какой-нибудь мобильно-ориентированный минималистичный фреймворк, например, Zepto (в нем есть 'tap', 'swipe' и т.п.).
          0
          В чём заморочки-то? Лишь добавляем хранение флага и его сброс и взведение в нужных местах. Делов — на три строчки кода. И зачем здесь цеплять какие-то фреймворки? Мобильный webview не очень-то радуется, когда его обвешивают кучей ненужных скриптов.
            0
            Ладно-ладно (: А почему «мобильный webview не очень-то радуется, когда его обвешивают кучей ненужных скриптов».
              0
              Причина проста — шибко медленно он их прожёвывает.
                0
                А вы, случайно, не в курсе, PhoneGap в итоге формирует приложение с веб-вью или же там все сложнее? А то все руки не доходят посмотреть.
                  0
                  WebView + JS + JavaScript Bridge, через который вызывается Java код посредством JS.
                    0
                    Не фонтан, в общем.
                      0
                      Беда в том, что Titanium на который я стало было начал смотреть судя по отзывам не лучше. Если кратко, то кроссплатформенная разработка с помощью него чего-то сложнее примеров это миф, каждый раз приходится пилить под конкретную платформу, потому что все работает как хочет. А полного контроля нет, так что только костыли.

                      Может тут есть разработчики, которые его тыкали? Правда все так плохо?
                        0
                        У Titanium'а принцип работы такой же, как и PhoneGap, так что да, там всё уныло
                          0
                          Не совсем, по началу было точно также, но теперь view пишется не на html, а нативное. На JS теперь логика только.
            0
            Знаете я столкнулся с тем, что тот же jquery mobile вроде как предоставляет данный функционал.
            Беда только в том, что когда меняется страница, на ней загадочным образом тоже срабатывает это событие.
            Ну или кликаешь кнопку вызвать попап, и в попапе тоже ловится это событие.
            В результате пришлось в кнопках, ведущих к смене или изменению интерфейса возвращать клик обратно,
            либо кнопки ставить так, что бы на следующей вьюхе под кликом ничего не было. Так что осторожней.
              0
              Может это Bubbling?
                0
                Событие всплывает от наследника по всем родителям (и наоборот), а тут оно ловится, скажем так братом, этого элемента. Самый простой пример это у меня есть три страницы, который по смыслу идут так первая->вторая->тертья. У каждой в левом верхнем углу кнопка назад.

                При использование jquery mobile, это будут div.ui-page которые вставляются в body. Т.е они не вложены друг в друга, и вообще вставляются только в момент появления, а не заранее.

                Так вот, если я перешел первая-вторая-третья страница, а на последней нажал кнопку назад, то на второй она тоже срабатывает и я оказываюсь на первой.

                Вероятная причина это то, что страница успела сменится и тут срабатывает запоздалый клик, но почему так происходит непонятно.

                Тоже самое если делеать интерфейс просмотра картинок, когда плашки сами убираются, а далее при тапе по картинке появляюся снова. Если тапнуть вместе где на плашке, когда она появится, будет кнопка, то кнопка тоже сработает.
            +6
            Посты = Q&A?
              0
              Я тоже удивился почему оно тут, хотя в прочем вопрос на самом деле полезный, я в свое время полдня убил пока не дошло что надо не клик использовать.
              +2
              Подобная проблема есть и под iOS, только решение с помощью JavaScript. Remove onClick delay on Webkit for iPhone
                0
                А минусовать-то за что? Похожая проблема, причём я думаю, что предложенное по ссылке решение подойдёт и для Андроида, потому что движок (webkit) одинаковый и тут, и там.

              Only users with full accounts can post comments. Log in, please.