users have to click certain points on a image
10 скажет мне, что вместо putting invisible/transparent buttons over the image, каждый из которых имеет собственную обработку событий, вы выбрали любые клики по изображению, отправленному в одно место, и решите, какие клики идут с какой целью.
(а) (б) (с)
Что означает, если ваш образ выглядел (а), что вы хотите настроить точки (пиксельные), как (б):
Это понятно вызывает у вас проблемы, так как людям очень сложно ударить по этим маленьким объектам.
Вы решили, как исправить это, чтобы дать людям толстые пальцы и пытаться откалибровать, как жир их делать. Давайте попробуем использовать прецедент, когда пользователь пытается набрать 1238. В (c) я увеличиваю размер их пальца по мере их поступления. Поскольку пресса на 8 покрывала точки из 8 и 0, я бы сказал, что это слишком большой.
(д) (е) (е)
(г) показывает разумный размер для калибровки с этим подходом. Обратите внимание, что 1 и 3 все еще отсутствуют. 1 - промах просто потому, что эти кнопки не квадратные.Это ограничение этого толстого пальца. 3 - промах, потому что человек действительно промахнулся и нажал между кнопками. Если вы настаиваете на том, что 3 должны рассчитывать, я не знаю, как мы это сделаем без учета 2, 5, & 6 счетов. Если это то, что вы хотите, нам нужно прямоугольное обнаружение столкновения. Об этом позже.
Предполагая, что 3 следует рассматривать как промах, я хотел бы, чтобы вы считали, что (d) математически идентична (e). Это достижимо просто, добавив допуск к целям, а не пальцем пользователя. 1 и 3 по-прежнему промахиваются, но теперь, вместо того, чтобы заниматься калибровкой толщины пальца пользователя, мы только заботимся о том, насколько велики цели.
Простое мышление таким образом дает нам свободу с тем, что наши цели не являются квадратными. Это прямоугольники. Выполнение этого в (f) исправляет ошибки 1. Если у вас есть цели, все они имеют одинаковый размер и пропорцию, вам не нужно иметь дело с использованием разных допусков x и y. Если вы хотите иметь гибкость при изменении размеров, чтобы правильно справляться с этой зеленой кнопкой, прекратите моделирование целей как одну точку. Моделируйте их с помощью android.graphics.Rect
. На самом деле, я бы предпочел, чтобы вы моделировали их со своим собственным классом, который содержит android.graphics.Rect
, но это ящик с ООП. Я поднимусь в другое время.
Предполагая, что вы определили цель с new Rect(left, top, right, bottom)
] где-то и назначили его Rect r;
теперь вы можете обнаружить удар с r.contains((int) event.getX(), (int) event.getY());
Так как мы уже просмотрели наш нос богов ООП и отвергли идею кнопки Я скажем, за каждый клик, который вы прокручиваете через все целевые тесты, содержит().
(г)
Теперь, если вы действительно настаиваете на том, что 2, 3, 5, и 6 должны весь триггер, когда промахи пользователя нажимает 3 затем посмотреть в motionEvent.getSize()
. Это будет измерять "fatness" прикосновения от 0 до 1. Если доступно getToolMajor()
или getTouchMajor()
, они могут помочь вам оценить фактические пиксели, затронутые. Это может помочь узнать screen size, но насколько я могу судить по документации, размеры пикселей, созданные с использованием любого из них, будут приблизительными. Некоторое тестирование поможет определить, работает ли оно так, как есть, или если необходима постоянная масштабирования. Это, вероятно, меньше, чем вы ожидаете, потому что они были разработаны для программ рисования, которые дают больший удар с дополнительным давлением, а не для того, чтобы наблюдать за кончиками пальцев.
Используйте это как толерантность для создания другого Rect вокруг щелчка (давайте назовите его fatFinger
). Тест r.intersects(fatFinger)
в цикле, который поставляет вам каждые r
над вашим изображением. Каждый раз, когда это правда, вы нашли еще один r
.
Это должно дать вам что-то вроде (g). Теперь 3 пресса представляет собой пресс для прессы 2, 3, 5, & 6, 1-й прессу теперь 1 & 4 пресса, а нажатие 8 - это 8 & 0 нажмите.
2 пресс чудом все еще только 2 нажатия. Вытащить это почти так же сложно, как ударить точки точками. Это может быть хорошо для вашей игры, но, пожалуйста, не делайте этого с моим телефоном. :)
Если вы не хотите сойти с ума, сделайте небольшое ООП и создайте класс для своих целей, который содержит Rect и обеспечит ваш собственный метод пересечений, поддерживаемый Rect one. Таким образом, вы можете зациклить их, получить каждый t
и когда t.intersects(fatFinger)
верно вы можете назвать свой собственный t.wasTouched();
Короче говоря, откормить цели, а не палец, если вы не хотите, прикасаясь все, что приближается. Если это так, откормите обоих.
Независимо от того, если вы решите пойти с (f) или (g), я думаю, вы найдете гораздо меньше потребности в настройке размера пальца, если вы примете этот подход. Счастливое кодирование!
Если вы используете пользовательский метод 'onTouchEvent', вы можете реализовать меню настроек с помощью строки поиска и сохранить переменную' tolerance' с помощью [Shared Preferences] [1]. [1]: http://developer.android.com/guide/topics/data/data-storage.html#pref – JohnDow
Я не могу сказать, относится ли этот вопрос к проблеме обнаружения столкновения, получая настройку допуска от пользователя или о том, как рассчитать допуск в процентах. Вы действительно застряли на всех трех? – CandiedOrange