more - Android scrollview horizontal se comporta como iPhone(paginación)
pagination android library (4)
Tengo un LinearLayout dentro de un HorizontalScrollView. El contenido es solo una imagen. Durante el desplazamiento, debo lograr el mismo comportamiento que se obtiene al configurar la opción de paginación en el iPhone equivalente al HSW (el desplazamiento de la lista debe detenerse en todas las páginas de la lista, no seguir moviéndose).
¿Cómo se hace esto en Android? ¿Debo implementar estas funciones por mí mismo o hay una propiedad particular para establecer o una subclase de HSV para implementar?
El nuevo paquete de compatibilidad (revisión 3) en Android agregó un ViewPager que hace eso.
Encontré otra forma de obtener el mismo efecto y creo que es más legible. Aquí está el camino:
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = hsv.getScrollX();
float pagesCount = hsv.getChildCount();
float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;
int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
hsv.scrollTo((int) (page * pageLengthInPx), 0);
}
return false;
}
Entonces, mi solución es:
- Intercepte el evento onTouch y calcule si la página debería cambiar al siguiente o mantenerse en el actual
- Heredar de HorizontalScrollView y anular el método computeScroll
El método computeScroll llama para mover la lista. Por defecto, supongo que está implementado para desacelerar con una cierta proporción ... Ya que no quiero este movimiento, simplemente lo anulo sin especificar un cuerpo.
El código para el controlador de eventos es:
_scrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = _scrollView.getScrollX();
float pagesCount = _horizontalBar.getChildCount();
float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
float currentPage = currentPosition/pageLengthInPx;
Boolean isBehindHalfScreen = currentPage-(int)currentPage > 0.5;
float edgePosition = 0;
if(isBehindHalfScreen)
{
edgePosition = (int)(currentPage+1)*pageLengthInPx;
}
else
{
edgePosition = (int)currentPage*pageLengthInPx;
}
_scrollView.scrollTo((int)edgePosition, 0);
}
return false;
}
});
Y en mi HorizontalScrollView heredado
@Override
public void computeScroll (){
return;
}
Me encontré con una buena solución aquí:
Esta es una versión de GitHub del código que se encuentra aquí:
Puede parecer una exageración solo por usarlo en imágenes, pero esta solución permite una paginación infinita con un pequeño truco (es decir, cuando en la primera página puede retroceder a la última página y en la última página puede avanzar a la primera página). ). También te permite tener un número desconocido de páginas y generar contenido de forma dinámica mediante otro pequeño truco. Por favor vea mi comentario en el segundo enlace here
para detalles sobre cómo logré esto.
Espero que esto ayude.