Sincronizar la posición de dos vistas ScrollView

Estoy intentando sincronizar las posiciones de dos ScrollViews. Estoy intentando hacer esto para exhibir una lista de la guía de la TV.

He creado una clase personalizada que extiende RelativeLayout para mostrar la guía. Este diseño relativo tiene cuatro hijos: una vista de la imagen en la esquina superior izquierda, un HorizontalScrollView para mostrar los encabezados de las columnas en la parte superior derecha, un ScrollView para mostrar los encabezados de las filas en la parte inferior izquierda y un ScrollView en la parte inferior derecha que contiene las listas . Este ScrollView contiene una HorizontalScrollView, que a su vez contiene un LinearLayout con múltiples vistas secundarias que muestran los datos. Espero que esto lo explique claramente, pero aquí hay un diagrama para hacerlo más claro:

____________ |__|___hsv___| | | | | | sv -> | | | hsv -> | |sv| ll -> | | | etc | | | | |__|_________| 

Lo configuré de esta manera porque quería que los listados de guía se desplazaran horizontal y verticalmente, pero no hay ninguna vista de desplazamiento que lo haga. Además, quiero que los encabezados de fila y columna se muestren sin importar en qué posición estén los listados de guía, pero quiero que se alineen correctamente. Así que estoy tratando de encontrar una manera de sincronizar las posiciones de los dos hsv, y también para sincronizar las posiciones de los dos sv. También estoy tratando de hacerlo de una manera que evita la ejecución de un manejador cada pocos milisegundos para encuestar una vista y llamada scrollTo en el otro.

No estoy seguro de que esta sea la mejor manera de hacerlo, pero esto es lo que he inventado. Si alguien tiene alguna otra sugerencia, ¡siéntase libre!

¿No valdría la pena implementar onTouchEvent (MotionEvent me) en todos sus paneles? Cuando uno de sus paneles se desplaza, se llamará a este método, y puede asegurarse de que todos los demás se mantienen sincronizados.

Manejar los eventos táctiles no funciona al 100%. La cantidad de desplazamientos en diferentes vistas puede no estar sincronizada siempre.

Manejar los eventos táctiles no es suficiente, porque si haces un flick rápido, el desplazamiento se prolonga un rato después de soltar el tacto. La solución es anular el método computeScroll (). Echa un vistazo a https://github.com/chrisjenx/ParallaxScrollView cómo se hace allí.

Puedes echar un vistazo a este post: Link

Lo que este chico realmente está haciendo crea ScrollViews personalizado y anula el método onScrollChanged , añade un oyente y luego los sincroniza antes de que se dibujen en la pantalla.

Lo que puede hacer ahora es agregar como marco principal un ScrollView en una HorizontalScrollView . La barra de la izquierda sería un HorizontalScrollView , y la parte superior un ScrollView . A continuación, registra el ScrollView principal y el HorizontalScrollView principal a dos ScrollManagers separados (véase el enlace anterior).

A continuación, deshabilite el desplazamiento de hsv y sv y agréguelos a los ScrollManagers apropiados. Entonces todo debería funcionar bien.

PD. Si utilizas solo a los oyentes y no al ScrollManager , tendrás un retardo de sincronización de 1 frame.

He conseguido la misma disposición haciendo cosas abajo.

Usted encontrará SyncedScrollView en xml es scrollview personalizado usado para sincronizar dos scrollviews.

Debes referirte a continuación dos respuestas de stackoverflow.

  1. SynchedScrollView respuesta andig
  2. Optimizado SynchedScrollView mi respuesta

Ver abajo xml

 <RelativeLayout android:id="@+id/activity_main_linear_before_all_scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/activity_main_empty_box" android:layout_width="50dp" android:layout_height="30dp" android:text="xx" android:gravity="center" /> <com.example.SyncedScrollView android:id="@+id/activity_main_observable_scrollview_1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_below="@+id/activity_main_empty_box" android:fadeScrollbars="false" android:overScrollMode="never" android:scrollbars="none"> <LinearLayout android:id="@+id/activity_main_linear_left_headers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="row 3" /> </LinearLayout> </com.example.SyncedScrollView> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toEndOf="@+id/activity_main_empty_box" android:layout_toRightOf="@+id/activity_main_empty_box" android:fadeScrollbars="false" android:overScrollMode="never"> <RelativeLayout android:id="@+id/activity_main_body_relative" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:id="@+id/activity_main_top_headers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="column 3" /> </LinearLayout> <com.example.SyncedScrollView android:id="@+id/activity_main_observable_scrollview_2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/activity_main_top_headers" android:fadeScrollbars="false" android:overScrollMode="never" android:scrollbars="vertical"> <LinearLayout android:id="@+id/activity_main_body" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/activity_main_body_row_1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="1,3" /> </LinearLayout> <LinearLayout android:id="@+id/activity_main_body_row_2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="2,3" /> </LinearLayout> <LinearLayout android:id="@+id/activity_main_body_row_3" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,1" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,2" /> <TextView android:layout_width="50dp" android:layout_height="30dp" android:gravity="center" android:padding="5dp" android:text="3,3" /> </LinearLayout> </LinearLayout> </com.example.SyncedScrollView> </RelativeLayout> </HorizontalScrollView> </RelativeLayout> 

Cada celda es TextView aquí. Así que usted puede fijar el fondo dibujable para dibujar las cajas (parecerá la tabla)

También puede agregar encabezados izquierdo, encabezados superiores y cuerpo TextView dinámicamente para crear tabla dinámicamente.

Esta es una captura de pantalla del diseño Esta es una captura de pantalla del diseño

Lo siento por mi inglés puro.

  • Vista vacía en el adaptador de lista expandible
  • Recuperar el adaptador original de expandiblelistview con el encabezado
  • ¿Cómo escondo un WebView?
  • Cómo obtener un enum que se crea en attrs.xml en el código
  • ¿View.setVisibility (View.VISIBLE) obliga a la vista a volver a dibujar incluso si ya es visible?
  • Analógico de android: filterTouchesWhenObscured para el nivel de API inferior a 9
  • No es un archivo DRM, abriendo notmally
  • ¿Es posible cambiar el navegador / motor predeterminado para la vista Web de Android?
  • Las vistas agregadas dinámicamente desaparecen en orientación en Android
  • Ver onDraw (Canvas c) versus dibujar (Canvas c) en android?
  • Cómo obtener la altura de la vista dentro del adaptador para crear bitmap de tamaño?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.