2014-10-25 3 views
5

Ive пытался развить эту игру, где пользователям нужно щелкнуть определенные точки на изображении. Я сохранил эти точки на основе их местоположений пикселей. я могу легко получить пиксель нажатием, получив координаты X и Y в событии onTouch. Но проблема заключается в том, что ее практически невозможно нажимать точное местоположение пикселей каждый раз (поэтому для целей тестирования я установил допуск 40 px во всех 4 направлениях). Итак, есть ли способ установить какой-то допуск, который можно настроить из меню настроек, чтобы он мог легко использоваться людьми с различными размерами пальцев и воспроизводиться с разных размеров экрана? Любая помощь или предложения с благодарностью принялКак увеличить область касания на определенный процент?

tolerance = 40 
public boolean onTouchEvent(MotionEvent event) { 
    // MotionEvent object holds X-Y values 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     int XCood = (int) event.getX(); 
     int YCood = (int) event.getY(); 
     int XMin = ActXCod[index] - tolerance, 
      XMax = ActXCod[index] + tolerance, 
      YMin = ActYCod[index] - tolerance, 
      YMax = ActYCod[index] + tolerance; 
     if (index < (limit - 1)) // loop to check number of images 
     { 
      if(XCood > XMin && XCood < XMax && YCood > YMin && YCood < YMax){ 
      //Do stuff 
     }}} 

здесь XMIN и Xmax являются минимальная и максимальная ярость Х Координата может быть и Ymin и Ymax являются минимальная и максимальная дальность Y координате.
XCood и YCood - это координаты a и y пользователей.

+0

Если вы используете пользовательский метод 'onTouchEvent', вы можете реализовать меню настроек с помощью строки поиска и сохранить переменную' tolerance' с помощью [Shared Preferences] [1]. [1]: http://developer.android.com/guide/topics/data/data-storage.html#pref – JohnDow

+0

Я не могу сказать, относится ли этот вопрос к проблеме обнаружения столкновения, получая настройку допуска от пользователя или о том, как рассчитать допуск в процентах. Вы действительно застряли на всех трех? – CandiedOrange

ответ

1

users have to click certain points on a image10 скажет мне, что вместо putting invisible/transparent buttons over the image, каждый из которых имеет собственную обработку событий, вы выбрали любые клики по изображению, отправленному в одно место, и решите, какие клики идут с какой целью.

enter image description here (а) enter image description here (б) enter image description here (с)

Что означает, если ваш образ выглядел (а), что вы хотите настроить точки (пиксельные), как (б):

Это понятно вызывает у вас проблемы, так как людям очень сложно ударить по этим маленьким объектам.

Вы решили, как исправить это, чтобы дать людям толстые пальцы и пытаться откалибровать, как жир их делать. Давайте попробуем использовать прецедент, когда пользователь пытается набрать 1238. В (c) я увеличиваю размер их пальца по мере их поступления. Поскольку пресса на 8 покрывала точки из 8 и 0, я бы сказал, что это слишком большой.

enter image description here (д) enter image description here (е) enter image description here (е)

(г) показывает разумный размер для калибровки с этим подходом. Обратите внимание, что 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()); Так как мы уже просмотрели наш нос богов ООП и отвергли идею кнопки Я скажем, за каждый клик, который вы прокручиваете через все целевые тесты, содержит().

enter image description here (г)

Теперь, если вы действительно настаиваете на том, что 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), я думаю, вы найдете гораздо меньше потребности в настройке размера пальца, если вы примете этот подход. Счастливое кодирование!

+0

+1 из-за глубокого мышления. В зависимости от потребностей я вижу риск добавления ненужной сложности, но отличный анализ! –

+0

Спасибо! Если он не делает (g), самый простой способ избежать сложностей - использовать прозрачные кнопки над трюком изображения, о котором я упоминал в начале. Это эквивалентно (f) и снимает обнаружение столкновения с ваших рук. – CandiedOrange

+0

@CandiedOrange благодарит вас за вашу помощь. Я решил свою проблему :) –

3

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

Существует еще некоторая информация и примеры кода на http://developer.android.com/training/gestures/viewgroup.html#delegate

счастливым кодирования!

+0

привет @francesco благодарит за предложение. но проблема в том, что, поскольку я установил допуск до 40, это может быть на маленьком экране на большом экране, есть ли способ динамически изменять размер экрана? потому что я должен убедиться, что затронутый пиксель близок к фактическому пиксели. –

+0

Что такое калибровка сенсорного элемента с использованием допуска и ширины и высоты изображения? Предполагая, что у вас есть допуски от 0 до 1, что-то вроде: (это изменено из ссылки, которую я опубликовал в ответе, не проверен) 'delegateArea.left - = tolerance * myButton.getWidth(); delegateArea.top - = tolerance * myButton.getHeight(); delegateArea.right + = tolerance * myButton.getWidth(); delegateArea.bottom + = tolerance * myButton.getHeight(); ' –

0

Так есть ли способ я могу установить какое-то терпимость, которую можно регулировать в меню настроек, так что она может быть использована людьми с дифф размерами пальцев с легкостью и играла с разных размерами экрана

Если я правильно вас понимаю, просто сохраните свой допуск в DP и преобразуйте его в зависимости от плотности экрана. Программно вы можете преобразовать, как описано здесь: Convert dip to px in Android Или сохранить доступные значения допуска в файле dimens.xml и прочитать эти значения.

Смежные вопросы