12
votes

Deux défilement directionnelle Vue

Je voudrais avoir une section linéarlayout avec une section d'en-tête sur le dessus et une vision Web ci-dessous. L'en-tête sera court et la View de Web peut être plus longue et plus large que l'écran.

Quel est le meilleur moyen d'obtenir un défilement horizontal et vertical? Est une envoi de ScrollView intérieure à l'intérieur d'une horizontalecrollview une bonne idée?


0 commentaires

9 Réponses :


9
votes

est une enveloppe de défilement imbriquée dans un horizontalscrolls une bonne idée?

oui, et non.

Oui, ma compréhension est que ScrollView et horizontalscrollview peut être imbriqué.

Non, afaik, ni Scrollview NOR horizontalscrollview Travailler avec webview .

Je suggère que vous avez votre webview ajusté à l'écran.


9 commentaires

Je peux dire, pour que vous puissiez être imbriqué comme je l'ai fait, mais l'expérience utilisateur est médiocre, car il peut être difficile de le faire défiler dans la direction souhaitée et il n'y a pas d'interprétation diagonale - -Vous obtenez tous les mouvements verticaux ou tous horizontaux.


"Demandez à votre webview adapté à l'écran." Malheureusement, je n'ai pas le moyen de le faire :(


@Blumer j'ai remarqué. C'est acceptable pour moi mais pas optimal.


@Georgebiley: "Malheureusement, je n'ai aucun moyen de le faire" - Qu'est-ce qui vous arrête?


Les pages sont générées par l'utilisateur et s'il contient une longue ligne de tirets ou une image, il serait trop large et s'il y avait trop de contenu, ce serait trop long.


@cjavapro: Alors? Webview Fait défiler en interne, comme un navigateur Web régulier.


Oh, c'est une bonne chose .. Je vais l'essayer aujourd'hui, merci.


J'ai pu utiliser la largeur Fill_Parent et Hauteur Wrap_Content sur la vue Web. Lorsque la vue Web est un enfant d'une disposition linéaire verticale qui est un enfant d'une vue de défilement, le défilement vertical s'applique à toute la disposition linéaire et à l'horizontale uniquement sur la vue Web, la diagonale ne fonctionne pas. Je peux tout mettre dans le webview pour obtenir un défilement diagonal, mais cela n'est pas probable.


@Commonsware aidez-moi s'il vous plaît aidez-moi Stackoverflow.com/Questtions/47952573/...



-3
votes

Je sais que vous avez accepté votre réponse, mais peut-être que cela pourrait vous donner une idée.

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<HorizontalScrollView
    android:layout_alignParentBottom="true"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
<ImageView

android:src="@drawable/device_wall"
android:scaleType="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</HorizontalScrollView>
</RelativeLayout>
</LinearLayout>
</ScrollView>


2 commentaires

On dirait que l'inverse de "ScrollView niché à l'intérieur d'une horizontalecrollview" . Y a-t-il quelque chose que je manque?


Ouais, et quoi dans le monde les linearlayout et le relativelayAjouteront-ils dans cette solution? À moins qu'ils servent une sorte d'objectif inexpliqué, ils doivent être retirés pour garder la hiérarchie de vue aussi plate que possible.



8
votes

Deux ans plus loin dans la ligne, je pense que la communauté open source pourrait avoir à votre secours: Vue de défilement 2D .

EDIT: Le lien ne fonctionne plus, mais Voici un lien vers une ancienne version du blogpost ;


4 commentaires

3 ans plus loin dans la ligne et le lien est parti


Merci! Agréable de voir les gens se soucier :)


Les liens sont à nouveau morts. J'ai créé un projet de bibliothèque avec cette classe et la poussé à Maven pour d'autres: Github.com/jaredrumler/twodscrollvieweight


Des problèmes peuvent survenir avec la classe TwodscrollView liée ci-dessus. Par exemple, lorsque le parent de ScrollView est Framelayout qui a une dimension définie sur une valeur constante [pas envelopper / correspond], la taille de ScrollView dans cette dimension sera égale à la taille réelle de son enfant [ScrollView] Enfant qui fera à son tour Disponaletoscroll variable égal à 0.



8
votes

Il y a un autre moyen. moddifié horizontalscrollview strong> en tant que wrapper pour ScrollView strong>. Normal horizontalscrollview strong> Lorsque des événements tactiles de capture ne les transmettent pas à ScrollView forts> et que vous ne pouvez faire sauter un moyen à l'heure. Voici une solution:

    @Override public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

/*BIDIRECTIONAL SCROLLVIEW*/
        ScrollView sv = new ScrollView(this);
        WScrollView hsv = new WScrollView(this);
        hsv.sv = sv;
/*END OF BIDIRECTIONAL SCROLLVIEW*/

        RelativeLayout rl = new RelativeLayout(this);
        rl.setBackgroundColor(0xFF0000FF);
        sv.addView(rl, new LayoutParams(500, 500));
        hsv.addView(sv, new LayoutParams(WRAP_CONTENT, MATCH_PARENT /*or FILL_PARENT if API < 8*/));
        setContentView(hsv);
    }


3 commentaires

Je peux confirmer que cela fonctionne! Dans ma version, j'ai un point de vue contenant des défilements x et y imbriqués. Je remplace le eclusevent oigninceptouchevent et transmettez l'objet MotionEvent sur les deux vues de défilement, juste comme décrit dans cette réponse. Expérience lisse, les deux directions.


Afin de faire du travail, je devais adapter à Aouchevent pour toujours appeler Sv.ontouchevent et j'ai modifié la valeur de retour à True. Notez également que vous devez prolonger la vue extérieure. Dans mon cas, j'ai eu une horizontalscrollview imbriquée dans une vision de Scroll (Vertical )View, donc je devais prolonger la verticale.


Pouvez-vous fournir XML? Comment utiliser cela?



2
votes

Il y a une solution de contournement facile: Dans votre activité, obtenez une référence à la Scroll View (Je vais assumer une vision de Scroll VerticalView) et une référence au premier enfant de cette vue de défilement.

Scrollview scrollY = (ScrollView)findViewById(R.id.scrollY);
LinearLayout scrollYChild = (LinearLayout)findViewById(R.id.scrollYChild);

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    scrollYChild.dispatchTouchEvent(event);
    scrollY.onTouchEvent(event);
    return true;
}


0 commentaires

3
votes

J'ai cherché vraiment longtemps à faire ce travail et a finalement trouvé ce fil ici. Wasikuss 'Réponse est venu assez proche de la solution, mais il n'a toujours pas fonctionné correctement. Voici comment ça fonctionne très bien (au moins pour moi (Android 2.3.7)). J'espère que cela fonctionne également sur toute autre version Android.

Créer une classe appelée vscrollview strong>: p> xxx pré>

Votre mise en page devrait ressembler à: P>

hScroll = (HorizontalScrollView) findViewById(R.id.scrollHorizontal);
vScroll = (VScrollView) findViewById(R.id.scrollVertical);
vScroll.sv = hScroll;


1 commentaires

Est-ce que cela supporte le défilement diagonal?



2
votes

Fin de répondre, mais peut-être, espérons utile à quelqu'un. Vous pouvez consulter droïde-UIScrollView . Ceci est fortement basée sur @ réponse de MrCeeJ, mais il me semblait avoir beaucoup de mal à obtenir le contenu réel à rendre. D'où j'ai tiré dans la dernière source HorizontalScrollView < / a> et ScrollView créer droïde-UIScrollView . Il y a quelques Todo gauche que je ne l'ai pas eu l'occasion à la fin, mais il ne suffit d'obtenir du contenu pour faire défiler horizontalement et verticalement en même temps entrer la description d'image ici


0 commentaires


1
votes

Pendant un certain temps, j'ai essayé des solutions d'ici, mais celui qui fonctionne le mieux était encore un problème: il a mangé tous les événements, aucun n'a été fait à travers des éléments dans la barre de défilement

J'ai. ... encore une autre réponse, dans Github et bien commenté au moins je l'espère: https://github.com/Wilm0r/giggity/blob/master/app/src/main/java/net/gaast/giggity/NestedScroller.java

Comme toutes les solutions, il est un HorizontalScrollview imbriquée (externe) + ScrollView (intérieure), avec les événements tactiles de réception externes à partir d'Android, et la réception intérieure les uniquement en interne de la vue extérieure. p>

et pourtant je compte sur les ScrollViews de décider si un événement tactile est intéressant et jusqu'à ce qu'ils acceptent, ne rien faire si des touches (par exemple les robinets à ouvrir des liens / etc) peuvent encore le faire à des éléments de l'enfant. p>

(également les supports de vue pincez pour zoomer dont je avais besoin.) p>

Dans le scr extérieur Oller: p>

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        /* All touch events should come in via the outer horizontal scroller (using the Int
           functions below). If Android tries to send them here directly, reject. */
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        /* It will still try to send them anyway if it can't find any interested child elements.
           Reject it harder (but pretend that we took it). */
        return true;
    }

    public boolean onInterceptTouchEventInt(MotionEvent event) {
        return super.onInterceptTouchEvent(event);
    }

    public boolean onTouchEventInt(MotionEvent event) {
        super.onTouchEvent(event);
    }


1 commentaires

Veuillez ajouter une partie du code pertinent de votre GitHub dans votre réponse ici.