Quiero que la fling
detección de gestos funcione en mi aplicación de Android.
Lo que tengo es un GridLayout
que contiene 9 ImageView
s. La fuente se puede encontrar aquí: Diseño de cuadrícula de Romain Guys .
Ese archivo que tomo es de la aplicación Photostream de Romain Guy y solo ha sido ligeramente adaptado.
Para la situación de clic simple, solo necesito establecer el valor onClickListener
de cada uno ImageView
que agregue para que sea el principal activity
que implemente View.OnClickListener
. Parece infinitamente más complicado implementar algo que reconozca a fling
. Supongo que esto se debe a que puede abarcar views
.
Si mi actividad se implementa
OnGestureListener
, no sé cómo configurarlo como el gestor de gestos paraGrid
lasImage
vistas que agrego.public class SelectFilterActivity extends Activity implements View.OnClickListener, OnGestureListener { ...
Si mi actividad se implementa,
OnTouchListener
entonces no tengo ningúnonFling
método paraoverride
hacerlo (tiene dos eventos como parámetros que me permiten determinar si la aventura fue notable).public class SelectFilterActivity extends Activity implements View.OnClickListener, OnTouchListener { ...
Si hago una costumbre
View
, comoGestureImageView
esa se extiendeImageView
, no sé cómo decirle a la actividad quefling
ha ocurrido una vista. En cualquier caso, intenté esto y los métodos no se llamaron cuando toqué la pantalla.
Realmente solo necesito un ejemplo concreto de esto trabajando en distintas vistas. ¿Qué, cuándo y cómo debo adjuntar esto listener
? Necesito poder detectar clics únicos también.
// 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;
}
}
});
¿Es posible colocar una vista transparente sobre la parte superior de mi pantalla para capturar aventuras?
Si elijo no ver las inflate
imágenes de mi hijo desde XML, ¿puedo pasar el GestureDetector
parámetro como constructor a una nueva subclase ImageView
que creo?
Esta es la actividad muy simple para la que estoy tratando de fling
que funcione la detección: SelectFilterActivity (Adaptado de photostream) .
He estado mirando estas fuentes:
Hasta ahora nada me ha funcionado y esperaba algunos consejos.
Respuestas:
Gracias a Code Shogun , cuyo código me adapté a mi situación.
Deje que su actividad se implemente
OnClickListener
como de costumbre:Adjunte su escucha de gestos a todas las vistas que agregue al diseño principal;
Observe con asombro cómo se ven afectados sus métodos anulados, tanto
onClick(View v)
de la actividad como delonFling
oyente de gestos.El baile post 'fling' es opcional pero se recomienda.
fuente
Una de las respuestas anteriores menciona el manejo de diferentes densidades de píxeles, pero sugiere calcular los parámetros de deslizamiento a mano. Vale la pena señalar que en realidad puede obtener valores razonables y escalados del sistema utilizando la
ViewConfiguration
clase:Noté que el uso de estos valores hace que la "sensación" de lanzamiento sea más consistente entre la aplicación y el resto del sistema.
fuente
swipeMinDistance = vc.getScaledPagingTouchSlop()
yswipeMaxOffPath = vc.getScaledTouchSlop()
.getScaledTouchSlop
me da muy poco resultado de compensación, torpemente. Por ejemplo, solo 24 píxeles en una pantalla de 540 de altura, es muy difícil mantenerlo dentro del alcance con el dedo. : SLo hago un poco diferente, y escribí una clase de detector adicional que implementa el
View.onTouchListener
onCreate
es simplemente agregarlo al diseño más bajo como este:donde id.lowestLayout es id.xxx para la vista más baja en la jerarquía de diseño y lowerLayout se declara como RelativeLayout
Y luego está la clase de detector de barrido de actividad real:
¡Funciona muy bien para mí!
fuente
Modifiqué y reparé ligeramente la solución de Thomas Fankhauser
Todo el sistema consta de dos archivos, SwipeInterface y ActivitySwipeDetector
SwipeInterface.java
Detector
se usa así:
Y en la implementación
Activity
, debe implementar métodos desde SwipeInterface , y puede averiguar en qué evento se llamó Ver el evento Swipe .fuente
v.performClick();
, que se usa para no consumir el evento en OnClickListener, si está configurado en la misma vista¡El código del detector de gestos de deslizamiento anterior es muy útil! Sin embargo, es posible que desee hacer que esta solución sea independiente de la densidad utilizando los siguientes valores relativos en
(REL_SWIPE)
lugar de los valores absolutos(SWIPE_)
fuente
Mi versión de la solución propuesta por Thomas Fankhauser y Marek Sebera (no maneja golpes verticales):
SwipeInterface.java
ActivitySwipeDetector.java
fuente
Esta pregunta es algo antigua y en julio de 2011 Google lanzó el Paquete de compatibilidad, revisión 3), que incluye el
ViewPager
que funciona con Android 1.6 en adelante. LasGestureListener
respuestas publicadas para esta pregunta no se sienten muy elegantes en Android. Si está buscando el código utilizado para cambiar entre fotos en la Galería de Android o cambiar vistas en la nueva aplicación Play Market, entonces definitivamente esViewPager
.Aquí hay algunos enlaces para más información:
fuente
Hay una interfaz incorporada que puede usar directamente para todos los gestos:
Aquí hay una explicación para un usuario de nivel básico: Hay 2 importaciones, tenga cuidado al elegir que ambas son diferentes
fuente
Hay alguna propuesta en la web (y esta página) para usar ViewConfiguration. getScaledTouchSlop () para tener un valor a escala de dispositivo para
SWIPE_MIN_DISTANCE
.getScaledTouchSlop()
está diseñado para la distancia del "umbral de desplazamiento ", no para deslizar. La distancia del umbral de desplazamiento debe ser menor que una distancia del umbral de "oscilación entre páginas". Por ejemplo, esta función devuelve 12 píxeles en mi Samsung GS2, y los ejemplos citados en esta página son alrededor de 100 píxeles.Con API Level 8 (Android 2.2, Froyo), tienes
getScaledPagingTouchSlop()
, pensado para deslizar la página. En mi dispositivo, devuelve 24 (píxeles). Entonces, si está en el nivel de API <8, creo que "2 *getScaledTouchSlop()
" debería ser el umbral de deslizamiento "estándar". Pero los usuarios de mi aplicación con pantallas pequeñas me dijeron que eran muy pocos ... Como en mi aplicación, puede desplazarse verticalmente y cambiar de página horizontalmente. Con el valor propuesto, a veces cambian de página en lugar de desplazarse.fuente
También como una mejora menor.
La razón principal del bloque try / catch es que e1 podría ser nulo para el movimiento inicial. Además del try / catch, incluya una prueba de nulo y retorno. similar al siguiente
fuente
Hay mucha información excelente aquí. Desafortunadamente, gran parte de este código de procesamiento de lanzamiento se encuentra disperso en varios sitios en varios estados de finalización, aunque uno pensaría que esto es esencial para muchas aplicaciones.
Me he tomado el tiempo para crear un oyente de lanzamiento que verifique que se cumplen las condiciones apropiadas. He agregado un oyente de cambio de página que agrega más comprobaciones para garantizar que los cambios cumplan con el umbral para los cambios de página. Ambos oyentes le permiten restringir fácilmente los lanzamientos al eje horizontal o vertical. Puede ver cómo se usa en una vista para imágenes deslizantes . Reconozco que la gente de aquí ha realizado la mayor parte de la investigación. La acabo de reunir en una biblioteca utilizable.
Estos últimos días representan mi primer intento de codificación en Android; Espero mucho más por venir.
fuente
Esta es una respuesta combinada de las dos respuestas en la parte superior, si alguien quiere una implementación funcional.
fuente
absDeltaY > minSwipeDelta
,absVelocityY > minSwipeVelocity
,absVelocityY < maxSwipeVelocity
sólo en caso de que siminSwipeDelta
! =getScaledTouchSlop
,minSwipeVelocity
! =getScaledMinimumFlingVelocity
,maxSwipeVelocity
! =getScaledMaximumFlingVelocity
, Es decir, para comprobar si estos llamados “default” (me refiero a getScaledTouchSlop, getScaledMinimumFlingVelocity, getScaledMaximumFlingVelocity) los valores se escalan o se cambian de acuerdo a su propio deseoACTION_UP
, noACTION_MOVE
oACTION_POINTER_UP
, es decir, solo como resultado del gesto totalmente realizado). (No he comprobado otras versiones de API, por lo que se agradecen los comentarios).Puede usar la biblioteca droidQuery para manejar lanzamientos, clics, clics largos y eventos personalizados. La implementación se basa en mi respuesta anterior a continuación, pero droidQuery proporciona una sintaxis simple y elegante:
Respuesta original
Esta respuesta utiliza una combinación de componentes de las otras respuestas aquí. Consiste en la
SwipeDetector
clase, que tiene una interfaz interna para escuchar eventos. También proporciono unaRelativeLayout
para mostrar cómo anularView
elonTouch
método de una para permitir eventos de deslizamiento y otros eventos detectados (como clics o clics largos).SwipeDetector
Vista del interceptor deslizante
fuente
SwipeInterceptorView
, por lo que su clic se maneja primero. Puede solucionar esto implementando su propio mecanismo de clic implementandoonTouchListener
, o como solución alternativa , puede escuchar clics largos en lugar de clics (verView.setOnLongClickListener
).Sé que es demasiado tarde para responder, pero aun así estoy publicando la detección de deslizamiento para ListView que cómo usar Swipe Touch Listener en el elemento ListView .
Referencia: Exterminator13 (una de las respuestas en esta página)
Hacer una ActivitySwipeDetector.class
Llámalo desde tu clase de actividad así:
Y no olvide implementar SwipeInterface, que le dará dos métodos @override:
fuente
MAX_OFF_PATH = 5 * vc.getScaledPagingTouchSlop()
es más cómodo para un deslizamiento del pulgar que viaja naturalmente en un ligero arco.Los gestos son esos movimientos sutiles para desencadenar interacciones entre la pantalla táctil y el usuario. Dura el tiempo desde el primer toque en la pantalla hasta el punto en que el último dedo sale de la superficie.
Android nos ofrece una clase llamada GestureDetector mediante el cual podemos detectar gestos comunes como tocando abajo y arriba, deslizando vertical y horizontalmente (aventura), pulsación larga y corta, grifos dobles, etc . y adjuntar oyentes a ellos.
Haga que nuestra clase de actividad implemente GestureDetector.OnDoubleTapListener (para la detección de gestos de doble toque) y GestureDetector.OnGestureListener e implemente todos los métodos abstractos. Para obtener más información. puede visitar https://developer.android.com/training/gestures/detector.html . Cortesía
Para prueba de demostración. GestureDetectorDemo
fuente
Si no desea crear una clase separada o hacer que el código sea complejo,
puede crear una variable GestureDetector dentro de OnTouchListener y hacer que su código sea más fácil
namVyuVar puede ser cualquier nombre de la Vista en la que necesita establecer el listado
fuente
A todos: no se olviden del caso MotionEvent.ACTION_CANCEL:
Invoca un 30% de deslizamientos sin ACTION_UP
y es igual a ACTION_UP en este caso
fuente
Introduje una clase más genérica, tomé la clase de Tomas y agregué una interfaz que envía eventos a su actividad o fragmento. registrará el oyente en el constructor, así que asegúrese de implementar la interfaz o se producirá una ClassCastException. la interfaz devuelve uno de los cuatro int finales definidos en la clase y devolverá la vista en la que se activó.
fuente