2010-03-20 9 views
6

J'essaye de synchroniser les positions de deux ScrollViews. J'essaye de faire ceci pour montrer une liste de guide de TV.Synchroniser la position de deux vues ScrollView

J'ai créé une classe personnalisée qui étend RelativeLayout pour afficher le guide. Cette disposition relative a quatre enfants: une vue d'image dans le coin supérieur gauche, un HorizontalScrollView pour afficher les en-têtes de colonne en haut à droite, un ScrollView pour afficher les en-têtes de ligne en bas à gauche et un ScrollView en bas à droite . Ce ScrollView contient ensuite un HorizontalScrollView, qui à son tour contient un LinearLayout avec plusieurs vues enfant qui affichent les données. J'espère que cela explique clairement, mais voici un diagramme pour le rendre plus clair:

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

Je l'ai mis comme ça parce que je voulais les listes de guidage pour faire défiler horizontalement et verticalement, mais il n'y a pas de vue de défilement qui fait cela . En outre, je souhaite que les en-têtes de ligne et de colonne s'affichent quelle que soit la position des listes de guides, mais je souhaite qu'ils soient alignés correctement. J'essaie donc de trouver un moyen de synchroniser les positions des deux hsv, et aussi de synchroniser les positions des deux sv. J'essaie également de le faire d'une manière qui évite d'exécuter un gestionnaire toutes les quelques millisecondes pour interroger une vue et appeler scrollTo de l'autre.

Je ne suis pas du tout sûr que ce soit la meilleure façon de le faire, mais c'est ce que j'ai trouvé. Si quelqu'un a d'autres suggestions, n'hésitez pas!

+0

@Billy ... avez-vous été en mesure de trouver une solution pour cela? –

Répondre

1

Cela ne vaudrait-il pas la peine de mettre en œuvre onTouchEvent(MotionEvent me) dans tous vos panneaux? Lorsque l'un de vos panneaux est défilé, cette méthode est appelée, et il peut s'assurer que tous les autres sont synchronisés.

1

La gestion des événements tactiles ne fonctionne pas à 100%. Le nombre de parchemins dans différentes vues peut ne pas toujours être synchronisé.

1

La gestion des événements tactiles n'est pas suffisante, car si vous effectuez un mouvement rapide, le défilement se poursuit pendant un certain temps après avoir relâché le contact. La solution consiste à remplacer la méthode computeScroll(). Jetez un oeil à https://github.com/chrisjenx/ParallaxScrollView comment cela est fait là-bas.

0

Vous pouvez jeter un oeil à ce poste: Link

Qu'est-ce que ce gars-là est en train de faire, il crée ScrollViews personnalisés et remplace la méthode onScrollChanged, ajoute un auditeur, puis les synchronise avant ils sont attirés à l'écran .

Ce que vous pouvez faire maintenant est d'ajouter comme trame principale un ScrollView dans un HorizontalScrollView. La barre de gauche serait HorizontalScrollView, et la partie supérieure serait ScrollView. Ensuite, vous enregistrez le principal ScrollView et le principal HorizontalScrollView à deux séparés ScrollManagers (voir le lien ci-dessus).

Ensuite, désactivez le défilement de hsv et sv et ajoutez-les au ScrollManagers approprié. Ensuite, tout devrait bien fonctionner.

-

PS. Si vous utilisiez uniquement les écouteurs eux-mêmes et non le ScrollManager, vous auriez un délai de synchronisation de 1 image.

0

J'ai atteint la même mise en page en faisant ci-dessous les choses.Vous trouverez SyncedScrollView en XML est scrollview personnalisé utilisé pour synchroniser deux scrollviews.

Vous devez vous référer ci-dessous à deux réponses de stackoverflow.

  1. SynchedScrollView andig answer
  2. optimisé SynchedScrollView my answer

chèque ci-dessous 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> 

Chaque cellule est TextView ici. donc vous pouvez définir l'arrière-plan drawable pour dessiner des boîtes (il ressemblera à la table)

Vous pouvez également ajouter dynamiquement des en-têtes à gauche, des en-têtes supérieurs et le corps TextView pour créer une table dynamiquement.

C'est capture d'écran de mise en page This is screen shot of layout

Désolé pour mon pur anglais.

Questions connexes