Scrollview vertical et horizontal dans Android

Je suis vraiment fatigué à la recherche d'une solution pour Scrollview verticale et horizontale.

J'ai lu qu'il n'y avait pas de vues / mises en page dans le cadre qui implémentent cette fonctionnalité, mais j'ai besoin de quelque chose comme ça:

  • Get bitmap from bitmapdescriptor
  • Ligne de séparateur / diviseur de dessin Android dans la mise en page?
  • Android Studio: Problèmes de rendu Les styles manquants - Le thème correct choisi pour cette mise en page, Impossible de trouver un style avec un identifiant
  • Android4OpenCV: définition de la résolution au démarrage
  • Fusion de modules dans Android Studio?
  • Phonegap - manipulation de la notification push une fois que j'ai quitté la portée de l'index avec window.location.replace
  • Je dois définir une disposition dans l'autre, la disposition enfant doit implémenter le défilement vertical / horizontal pour le déplacement.

    Initialement implémenté un code qui a déplacé le pixel de mise en page par pixel, mais je pense que ce n'est pas le bon chemin. Je l'ai essayé avec ScrollView et Horizontal ScrollView, mais rien ne fonctionne comme je le veux, car il n'exécute que le défilement vertical ou horizontal.

    Canvas n'est pas ma solution parce que je dois attacher des auditeurs à certains éléments enfants.

    Que puis-je faire?

  • Android: Quelles sont les configurations recommandées pour Proguard?
  • Comment modifier la couleur de ligne dans EditText
  • Détecter si le contenu de EditText a été modifié par utilisateur ou par programme?
  • Quel est l'équivalent de setTimeOut () javascript sur Android?
  • Le tiroir de navigation sur NavigationDrawerItemSelecte appelé avant MainActivity onCreate?
  • Cordova Fonctionnalité des usages duplicées Android à partir de deux plugins
  • 11 Solutions collect form web for “Scrollview vertical et horizontal dans Android”

    Mélangeant certaines des suggestions ci-dessus, et a pu obtenir une bonne solution:

    Custom ScrollView:

    package com.scrollable.view; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ScrollView; public class VScroll extends ScrollView { public VScroll(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public VScroll(Context context, AttributeSet attrs) { super(context, attrs); } public VScroll(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent ev) { return false; } } 

    Custom HorizontalScrollView:

     package com.scrollable.view; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.HorizontalScrollView; public class HScroll extends HorizontalScrollView { public HScroll(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public HScroll(Context context, AttributeSet attrs) { super(context, attrs); } public HScroll(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent ev) { return false; } } 

    ScrollableImageActivity:

     package com.scrollable.view; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.widget.HorizontalScrollView; import android.widget.ScrollView; public class ScrollableImageActivity extends Activity { private float mx, my; private float curX, curY; private ScrollView vScroll; private HorizontalScrollView hScroll; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); vScroll = (ScrollView) findViewById(R.id.vScroll); hScroll = (HorizontalScrollView) findViewById(R.id.hScroll); } @Override public boolean onTouchEvent(MotionEvent event) { float curX, curY; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mx = event.getX(); my = event.getY(); break; case MotionEvent.ACTION_MOVE: curX = event.getX(); curY = event.getY(); vScroll.scrollBy((int) (mx - curX), (int) (my - curY)); hScroll.scrollBy((int) (mx - curX), (int) (my - curY)); mx = curX; my = curY; break; case MotionEvent.ACTION_UP: curX = event.getX(); curY = event.getY(); vScroll.scrollBy((int) (mx - curX), (int) (my - curY)); hScroll.scrollBy((int) (mx - curX), (int) (my - curY)); break; } return true; } } 

    la disposition:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.scrollable.view.VScroll android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/vScroll"> <com.scrollable.view.HScroll android:id="@+id/hScroll" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/bg"></ImageView> </com.scrollable.view.HScroll> </com.scrollable.view.VScroll> </LinearLayout> 

    Comme cela semble être le premier résultat de la recherche dans Google pour "Android vertical + horizontal ScrollView", j'ai pensé que je devrais ajouter ceci ici. Matt Clark a construit une vue personnalisée basée sur la source Android, et elle semble fonctionner parfaitement: Double Dimension ScrollView

    Veillez à ce que la classe de cette page comporte un bug calculant la largeur horizontale de la vue. Une correction de Manuel Hilty est dans les commentaires:

    Solution: Remplacez l'instruction à la ligne 808 par ce qui suit:

     final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.leftMargin + lp.rightMargin, MeasureSpec.UNSPECIFIED); 

    Edit: The Link ne fonctionne plus, mais voici un lien vers une ancienne version du blogpost .

    J'ai trouvé une meilleure solution.

    XML: (design.xml)

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:layout_width="90px" android:layout_height="90px"> <RelativeLayout android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="fill_parent"> </RelativeLayout> </FrameLayout> </FrameLayout> 

    Code Java:

     public class Example extends Activity { private RelativeLayout container; private int currentX; private int currentY; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.design); container = (RelativeLayout)findViewById(R.id.container); int top = 0; int left = 0; ImageView image1 = ... RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(left, top, 0, 0); container.addView(image1, layoutParams); ImageView image2 = ... left+= 100; RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(left, top, 0, 0); container.addView(image2, layoutParams); ImageView image3 = ... left= 0; top+= 100; RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(left, top, 0, 0); container.addView(image3, layoutParams); ImageView image4 = ... left+= 100; RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(left, top, 0, 0); container.addView(image4, layoutParams); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { currentX = (int) event.getRawX(); currentY = (int) event.getRawY(); break; } case MotionEvent.ACTION_MOVE: { int x2 = (int) event.getRawX(); int y2 = (int) event.getRawY(); container.scrollBy(currentX - x2 , currentY - y2); currentX = x2; currentY = y2; break; } case MotionEvent.ACTION_UP: { break; } } return true; } } 

    Ça fonctionne bien !!!

    Si vous souhaitez charger une autre disposition ou un autre contrôle, la structure est identique.

    Je l'utilise et fonctionne bien:

     <?xml version="1.0" encoding="utf-8"?> <ScrollView android:id="@+id/ScrollView02" android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <HorizontalScrollView android:id="@+id/HorizontalScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/ImageView01" android:src="@drawable/pic" android:isScrollContainer="true" android:layout_height="fill_parent" android:layout_width="fill_parent" android:adjustViewBounds="true"> </ImageView> </HorizontalScrollView> </ScrollView> 

    Le lien source est ici: Android-spa

    Ma solution basée sur la réponse de Mahdi Hijazi , mais sans vues personnalisées:

    Disposition:

     <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <ScrollView android:id="@+id/scrollVertical" android:layout_width="wrap_content" android:layout_height="match_parent" > <WateverViewYouWant/> </ScrollView> </HorizontalScrollView> 

    Code (onCreate / onCreateView):

      final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal); final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical); vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener private float mx, my, curX, curY; private boolean started = false; @Override public boolean onTouch(View v, MotionEvent event) { curX = event.getX(); curY = event.getY(); int dx = (int) (mx - curX); int dy = (int) (my - curY); switch (event.getAction()) { case MotionEvent.ACTION_MOVE: if (started) { vScroll.scrollBy(0, dy); hScroll.scrollBy(dx, 0); } else { started = true; } mx = curX; my = curY; break; case MotionEvent.ACTION_UP: vScroll.scrollBy(0, dy); hScroll.scrollBy(dx, 0); started = false; break; } return true; } }); 

    Vous pouvez modifier l'ordre des vues de défilement. Modifiez simplement leur commande dans la mise en page et dans le code. Et évidemment au lieu de WateverViewYouWant, vous mettez la mise en page / vues que vous souhaitez faire défiler les deux directions.

    Option n ° 1: vous pouvez créer une nouvelle conception d'interface utilisateur qui ne nécessite pas de défilement horizontal et vertical simultané.

    Option n ° 2: vous pouvez obtenir le code source pour ScrollView et HorizontalScrollView , apprendre comment l'équipe principale de Android a mis en œuvre ces applications et créer votre propre implémentation BiDirectionalScrollView .

    Option n ° 3: vous pouvez vous débarrasser des dépendances qui vous demandent d'utiliser le système de widgets et de dessiner directement sur le Canvas.

    Option n ° 4: Si vous vous trouvez sur une application open source qui semble mettre en œuvre ce que vous recherchez, regardez pour voir comment ils l'ont fait.

    Essaye ça

     <?xml version="1.0" encoding="utf-8"?> <ScrollView android:id="@+id/Sview" android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <HorizontalScrollView android:id="@+id/hview" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView ....... [here xml code for image] </ImageView> </HorizontalScrollView> </ScrollView> 

    Puisque le lien de défilement bidimensionnel est mort, je ne pouvais pas l'avoir ainsi, j'ai créé mon propre composant. Cela gêne et fonctionne correctement pour moi. La seule restriction est que wrap_content pourrait ne pas fonctionner correctement pour ce composant.

    https://gist.github.com/androidseb/9902093

    J'ai une solution pour votre problème. Vous pouvez vérifier le code ScrollView; il ne gère que le défilement vertical et ignore l'horizontal et modifiez ceci. Je voulais une vue comme une vision du Web, donc modifiée ScrollView et ça a bien fonctionné pour moi. Mais cela peut ne pas convenir à vos besoins.

    Permettez-moi de savoir quel type d'interface utilisateur vous ciblez.

    Cordialement,

    Ravi Pandit

    En jouant avec le code, vous pouvez placer un HorizontalScrollView dans une ScrollView. Ainsi, vous pouvez avoir les deux méthodes de défilement dans la même vue.

    Source: http://androiddevblog.blogspot.com/2009/12/creating-two-dimensions-scroll-view.html

    J'espère que cela pourrait vous aider.

    Pour définir les barres de défilement verticales et horizontales, voir http://android-code-crumbs.blogspot.com/

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.