я хочу получить fling
в моем приложении для Android работало распознавание жестов.
То, что у меня есть GridLayout
, содержит 9 ImageView
с. Источник может быть найден здесь: Romain Guys's Grid Layout .
Этот файл я взял из приложения Фотопотока Ромена Гая и только слегка адаптирован.
Для простой ситуации щелчка мне нужно только установить onClickListener
для каждого, что ImageView
я добавлю, чтобы быть основным, activity
который реализует View.OnClickListener
. Кажется, что бесконечно сложнее реализовать что-то, что распознает fling
. Я предполагаю, что это потому, что это может охватывать views
?
Если моя деятельность реализуется,
OnGestureListener
я не знаю, как установить это в качестве прослушивателя жестов дляGrid
илиImage
представлений, которые я добавляю.public class SelectFilterActivity extends Activity implements View.OnClickListener, OnGestureListener { ...
Если моя деятельность реализуется,
OnTouchListener
то у меня нетonFling
методаoverride
(у него есть два события в качестве параметров, позволяющих мне определить, заслуживает ли бросок внимания).public class SelectFilterActivity extends Activity implements View.OnClickListener, OnTouchListener { ...
Если я создаю обычай
View
, какGestureImageView
это расширяется,ImageView
я не знаю, как определить действие,fling
которое произошло в представлении. В любом случае, я попробовал это, и методы не были вызваны, когда я касался экрана.
Мне просто нужен конкретный пример этой работы через взгляды. Что, когда и как мне это прикрепить listener
? Я должен быть в состоянии обнаружить отдельные щелчки также.
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
Можно ли положить прозрачный вид поверх моего экрана, чтобы захватить броски?
Если я выберу не inflate
мои дочерние представления изображений из XML, могу ли я передать в GestureDetector
качестве параметра конструктора новый подклассImageView
который я создаю?
Это очень простое действие, для которого я пытаюсь заставить fling
работать детектор : SelectFilterActivity (адаптировано из фотопотока) .
Я смотрел на эти источники:
До сих пор у меня ничего не получалось, и я надеялся на несколько указателей.
Ответы:
Благодаря Код Сёгун , код которого я адаптировал к моей ситуации.
Пусть ваша деятельность реализуется
OnClickListener
как обычно:Прикрепите свой слушатель жестов ко всем представлениям, которые вы добавляете в основной макет;
С трепетом наблюдайте, как поражаются ваши переопределенные методы, как
onClick(View v)
активности, так иonFling
слушателя жестов.Танец пост-броска не обязателен, но приветствуется.
источник
В одном из приведенных выше ответов упоминается обработка с различной плотностью пикселей, но предлагается вычислять параметры свайпа вручную. Стоит отметить, что вы можете получить масштабированные, разумные значения из системы, используя
ViewConfiguration
класс:Я заметил, что использование этих значений приводит к тому, что «чувство» сброса становится более согласованным между приложением и остальной частью системы.
источник
swipeMinDistance = vc.getScaledPagingTouchSlop()
иswipeMaxOffPath = vc.getScaledTouchSlop()
.getScaledTouchSlop
неловко дает мне очень маленький результат смещения Например, всего 24 пикселя на экране с высотой 540, очень сложно держать его в пределах пальца. : SЯ делаю это немного по-другому, и написал дополнительный класс детектора, который реализует
View.onTouchListener
onCreate
просто добавьте его в самый низкий макет, как это:где id.lowestLayout - это id.xxx для представления, самого низкого в иерархии макета, а самое низкое значение объявлено как RelativeLayout
И затем есть фактический класс детектор движения салфетки:
Работает действительно хорошо для меня!
источник
Я слегка доработал и отремонтировал решение от Thomas Fankhauser
Вся система состоит из двух файлов, SwipeInterface и ActivitySwipeDetector
SwipeInterface.java
детектор
он используется так:
А при реализации
Activity
вам нужно реализовать методы из SwipeInterface , и вы сможете узнать, по какому вызову вызывалось событие View Swipe .источник
v.performClick();
, Который используется, чтобы не использовать событие для OnClickListener, если установлено на то же представлениеПриведенный выше код детектора жестов очень полезен! Однако вы можете захотеть сделать эту плотность раствора независимой, используя следующие относительные значения,
(REL_SWIPE)
а не абсолютные значения(SWIPE_)
источник
Моя версия решения, предложенная Томасом Фанкхаузером и Мареком Себерой (не обрабатывает вертикальные пролистывания):
SwipeInterface.java
ActivitySwipeDetector.java
источник
Этот вопрос устарел, и в июле 2011 года Google выпустила пакет совместимости, редакция 3), который включает в себя версию, которая
ViewPager
работает с Android 1.6 и выше. ВGestureListener
ответ отвечал на этот вопрос не чувствую себя очень элегантно на Android. Если вы ищете код, используемый для переключения между фотографиями в Галерее Android или переключения между режимами просмотра в новом приложении Play Market, то это точноViewPager
.Вот несколько ссылок для получения дополнительной информации:
источник
Есть встроенный интерфейс, который вы можете использовать непосредственно для всех жестов:
Вот объяснение для пользователя базового уровня: Есть 2 импорта, будьте осторожны при выборе, что оба отличаются
источник
В Интернете (и на этой странице) есть предложение использовать ViewConfiguration. getScaledTouchSlop (), чтобы иметь масштабируемое значение для устройства
SWIPE_MIN_DISTANCE
.getScaledTouchSlop()
предназначен для " прокрутки порога » расстояния, а не смахивания. Пороговое расстояние прокрутки должно быть меньше порогового расстояния для перехода между страницами. Например, эта функция возвращает 12 пикселей на моем Samsung GS2, а примеры, приведенные на этой странице, составляют около 100 пикселей.С API Level 8 (Android 2.2, Froyo) у вас есть
getScaledPagingTouchSlop()
, предназначенный для пролистывания страниц. На моем устройстве он возвращает 24 (пикселей). Поэтому, если вы находитесь на уровне API <8, я думаю, что «2 *getScaledTouchSlop()
» должно быть «стандартным» порогом прокрутки. Но пользователи моего приложения с маленькими экранами сказали мне, что его было слишком мало ... Как и в моем приложении, вы можете прокручивать по вертикали и менять страницу по горизонтали. С предложенным значением они иногда изменяют страницу вместо прокрутки.источник
Также как незначительное улучшение.
Основная причина блока try / catch заключается в том, что e1 может быть нулевым для начального перемещения. в дополнение к try / catch, включите тест на null и return. похоже на следующее
источник
Здесь много отличной информации. К сожалению, большая часть этого кода обработки разбросана по разным сайтам в разных состояниях завершения, хотя можно подумать, что это важно для многих приложений.
Я нашел время, чтобы создать прослушиватель, который проверяет, что соответствующие условия выполнены. Я добавил прослушиватель смены страниц, который добавляет больше проверок, чтобы гарантировать, что отклонения соответствуют порогу для переходов страниц. Оба этих слушателя позволяют вам легко ограничивать колебания по горизонтальной или вертикальной оси. Вы можете увидеть, как это используется в представлении для скольжения изображений . Я признаю, что люди здесь провели большую часть исследований - я просто собрал их в полезную библиотеку.
Эти последние несколько дней представляют мой первый опыт кодирования на Android; ожидайте гораздо большего .
источник
Это комбинированный ответ из двух ответов сверху, если кто-то хочет рабочую реализацию.
источник
absDeltaY > minSwipeDelta
,absVelocityY > minSwipeVelocity
,absVelocityY < maxSwipeVelocity
только в том случае , еслиminSwipeDelta
! =getScaledTouchSlop
,minSwipeVelocity
! =getScaledMinimumFlingVelocity
,maxSwipeVelocity
! =getScaledMaximumFlingVelocity
, То есть только для проверки , если эти так называемые « по умолчанию» (я имею в виду getScaledTouchSlop, getScaledMinimumFlingVelocity, getScaledMaximumFlingVelocity) значения масштабируются или изменены в соответствии с вашими собственное желание.ACTION_UP
, а неACTION_MOVE
илиACTION_POINTER_UP
, т. Е. Только как результат полностью реализованного жеста). (Я не проверял другие версии API, поэтому комментарии приветствуются).Вы можете использовать библиотеку droidQuery для обработки бросков, кликов, длинных кликов и пользовательских событий. Реализация построена на моем предыдущем ответе ниже, но droidQuery предоставляет простой, простой синтаксис:
Оригинальный ответ
Этот ответ использует комбинацию компонентов из других ответов здесь. Он состоит из
SwipeDetector
класса, который имеет внутренний интерфейс для прослушивания событий. Я также предоставляю,RelativeLayout
чтобы показать, как переопределить метод aView
,onTouch
чтобы разрешить как события смахивания, так и другие обнаруженные события (такие как щелчки или длинные щелчки).SwipeDetector
Swipe Interceptor View
источник
SwipeInterceptorView
, так что его щелчок обрабатывается первым. Вы можете исправить это, внедрив свой собственный механизмonTouchListener
щелчков путем реализации , или в качестве обходного пути вы можете прослушивать длинные щелчки вместо щелчков (см.View.setOnLongClickListener
).Я знаю, что уже слишком поздно, чтобы ответить, но все же я отправляю Swipe Detection for ListView, в которой рассказывается , как использовать Swipe Touch Listener в элементе ListView .
Refrence: Exterminator13 (один из ответов на этой странице)
Сделать один ActivitySwipeDetector.class
Назовите это из своего класса активности следующим образом:
И не забудьте реализовать SwipeInterface, который даст вам два метода @override:
источник
MAX_OFF_PATH = 5 * vc.getScaledPagingTouchSlop()
более удобно проводить пальцем по естественной дорожке, двигаясь по небольшой дуге.Жесты - это тонкие движения, запускающие взаимодействие между сенсорным экраном и пользователем. Оно длится в течение времени между первым касанием экрана и моментом, когда последний палец покидает поверхность.
Android предоставляет нам класс GestureDetector, с помощью которого мы можем обнаружить обычные жесты, такие как касание вниз и вверх, пролистывание по вертикали и горизонтали (отбрасывание), долгое и короткое нажатие, двойное нажатие и т. Д. . Д. и прикрепить к ним слушателей.
Сделайте, чтобы наш класс Activity реализовал интерфейсы GestureDetector.OnDoubleTapListener (для обнаружения жестов двойным касанием) и GestureDetector.OnGestureListener и реализовал все абстрактные методы. Для получения дополнительной информации. Вы можете посетить https://developer.android.com/training/gestures/detector.html . учтивость
Для демонстрационного теста. GestureDetectorDemo
источник
Если вам не нравится создавать отдельный класс или делать код сложным,
вы можете просто создать переменную GestureDetector внутри OnTouchListener и сделать ваш код более простым
namVyuVar может быть любым именем View, на которое нужно установить listner
источник
Для всех: не забывайте о случае MotionEvent.ACTION_CANCEL:
это вызывает в 30% свайпов без ACTION_UP
и это равно ACTION_UP в этом случае
источник
Я установил более общий класс, взял класс Томаса и добавил интерфейс, который отправляет события вашей деятельности или фрагменту. он зарегистрирует прослушиватель в конструкторе, поэтому убедитесь, что вы реализуете интерфейс, иначе возникнет исключение ClassCastException. интерфейс возвращает одно из четырех последних значений int, определенных в классе, и возвращает представление, для которого он был активирован.
источник