¿Hay alguna manera de hacer un ViewPager
que no se desplace horizontalmente, sino verticalmente?
android
android-viewpager
usuario1709805
fuente
fuente
Respuestas:
Puede usar un ViewPager.PageTransformer para dar la ilusión de una vertical
ViewPager
. Para lograr el desplazamiento con un arrastre vertical en lugar de uno horizontal, tendrá que anularViewPager
los eventos táctiles predeterminados e intercambiar las coordenadas deMotionEvent
s antes de manejarlos, por ejemplo:Por supuesto, puede ajustar esta configuración como mejor le parezca. Termina luciendo así:
fuente
ViewPager vertical
Las otras respuestas aquí parecen tener algunos problemas con ellas. Incluso los proyectos de código abierto recomendados no combinaban solicitudes de extracción recientes con correcciones de errores. Luego encontré una
VerticalViewPager
de Google que usaba alguna aplicación DeskClock. Confío en usar la implementación de Google mucho más que las otras respuestas que flotan por aquí. (La versión de Google es similar a la respuesta actual más votada, pero más exhaustiva).Ejemplo completo
Este ejemplo es casi exactamente el mismo que mi ejemplo de ViewPager básico , con algunos cambios menores para hacer uso de la
VerticalViewPager
clase.XML
Agregue los diseños xml para la actividad principal y para cada página (fragmento). Tenga en cuenta que usamos en
VerticalViewPager
lugar del estándarViewPager
. Incluiré el código para eso a continuación.activity_main.xml
fragment_one.xml
Código
El código para el
VerticalViewPager
no es mío. Es solo una versión simplificada (sin comentarios) del código fuente de Google. Echa un vistazo a esa para obtener la versión más actualizada. Los comentarios allí también son útiles para comprender lo que está sucediendo.VerticalViewPager.java
MainActivity.java
Solo cambié
VerticalViewPager
porViewPager
.Terminado
Debería poder ejecutar la aplicación y ver el resultado en la animación anterior.
Ver también
fuente
Tengo una solución que me funciona en dos pasos.
onInstantiateItem()
dePagerAdapter
, cree la vista y gírela por -90:Si está usando
FragmentPagerAdapter
, entonces:Girar la
ViewPager
vista en 90 grados:Funciona como un encanto al menos para mi requerimiento.
fuente
Para alguien que está luchando con cómo hacer que ViewPager vertical funcione dentro de horizontal, solo haga lo siguiente:
ViewPager vertical
ViewPager horizontal
fuente
Una ligera extensión de esta respuesta me ayudó a cumplir mi requisito (Vertical View Pager para animar de manera similar a Inshorts - Noticias en 60 palabras )
Espero que esto pueda ser útil para alguien más.
fuente
Hay algunos proyectos de código abierto que afirman hacer esto. Aquí están:
Estos han sido marcados como obsoletos por sus autores:
Y una cosa más:
deskclock
aplicación, pero no parece ser oficialmente compatible ya que no puedo encontrar documentación para ello.fuente
Mira esto: https://github.com/JakeWharton/Android-DirectionalViewPager
O la siguiente pregunta puede ayudarlo: Vertical 'Cuadrícula con páginas' o 'Viewpager'
fuente
DirectionalViewPager
no se ha actualizado durante bastante tiempo y, por lo tanto, le faltan algunas de las características más recientes de laViewPager
biblioteca de soporte; es decirsetPageMargin(int)
. Sin embargo, generalmente debería hacer el trabajo. Y si no, no es demasiado complicado tomar el código fuenteViewPager
e intercambiar toda la lógica x / y ancho / alto.DirectionalViewPager
pero, como dijo MH, ¡no está actualizado (su desarrollador lo considera DEPRECADO)! Es increíble que los desarrolladores de Android no hayan brindado a la comunidad una verticalViewPager
, sino solo horizontal. Soy nuevo en Android, desarrollar miViewPager
intercambio vertical x / y no es tan fácil para mí ... Preferiría una solución ya construida ... de todos modos, graciasSolo una mejora en las respuestas de @Brett y @ Salman666 para transformar correctamente las coordenadas (X, Y) en (Y, X) ya que las pantallas del dispositivo son rectangulares:
...
...
Sin embargo, aún queda algo por hacer para mejorar la capacidad de respuesta de la pantalla táctil. El problema podría estar relacionado con lo que @msdark comentó sobre la respuesta de @ Salman666.
fuente
true
enonInterceptTouchEvent
y yo también he modificado las asociaciones de teclas, por lo que el uso de un DPAD se dispara de desplazamiento con UP / DOWN en lugar de a la izquierda / derecha: gist.github.com/zevektor/fbacf4f4f6c39fd6e409fuente
En realidad, ya hay uno en la fuente de Android . Sin embargo, lo he modificado para que funcione mejor:
fuente
Un repositorio más activo actualmente es lsjwzh / RecyclerViewPager .
RecyclerView
fuente
Esta es una implementación de ViewPager de desplazamiento vertical. Funciona bien con RecyclerView y ListView. guochong / VerticalViewPager .
use ViewPager.PageTransformer para hacer que ViewPager se desplace verticalmente y también proporcione View.OnTouchListener para lidiar con el conflicto de desplazamiento.
fuente
Incluso me enfrentaba al mismo problema al hacer que ViewPager fuera vertical intercambiando X e Y. No fue nada sencillo.
Esto se debe a que solía funcionar solo cuando el ángulo de deslizamiento era inferior a 7.125 grados = arctan (1/8) mientras se interceptaba y 14 grados = arctan (1/4) mientras se toca; como ViewPager original horizontal, uno funciona cuando el ángulo de deslizamiento es inferior a 26.565 grados = arctan (1/2) mientras se intercepta y 45 grados = arctan (1) mientras se toca.
Es por eso que copié el código de Android support-core-ui y moví los valores a variables, que multipliqué usando la reflexión.
Encuentre el código y README en https://github.com/deepakmishra/verticalviewpager y VerticalViewPager en https://github.com/deepakmishra/verticalviewpager/blob/master/app/src/main/java/com/viewpager/VerticalViewPager .Java
fuente
la mejor manera es rotar el visor 90 grados y usar restricintLayout para ajustar la ubicación.
fuente
Terminé creando un nuevo DirectionalViewPager que puede desplazarse vertical u horizontalmente porque todas las soluciones que he visto aquí tienen fallas:
Implementaciones existentes de VerticalViewPager (por castorflex y LambergaR)
Truco de transformación con intercambio de coordenadas
VelocityTracker.computeCurrentVelocity
todavía calcula la velocidad con el eje X, probablemente porque internamente utiliza una llamada nativa que ignora el intercambio de coordenadas.Ver rotación
fuente