2017-08-22 1 views
0

Je travaille actuellement sur une application qui permet aux utilisateurs d'ajouter une disposition relative, une disposition linéaire ou une disposition linéaire imbriquée dans une disposition linéaire, qui est l'enfant d'une vue déroulante. Le défilement semble bien fonctionner lorsque seule la disposition relative ou la disposition linéaire est ajoutée, cependant, une fois la disposition linéaire imbriquée ajoutée, le défilement devient un problème. Fondamentalement, je veux que l'affichage de défilement commence à défiler une fois que ma vue traînée se trouve dans x quantité du haut/bas de l'écran. Aucun conseil? Ci-dessous est une partie de mon code pour aiderFaire glisser et déplacer le défilement dans une disposition linéaire

protected class myDragEventListener implements View.OnDragListener { 
    // This is the method that the system calls when it dispatches a drag event to the listener. 
    public boolean onDrag(View v, DragEvent event) { 
     // Defines a variable to store the action type for the incoming event 
     final int action = event.getAction(); 
     Point touchPosition = getTouchPositionFromDragEvent(v, event); 
     Log.d("y", String.format("%s", String.format("%s", eventTouchYCoord))); 
     //View dragView = (View) event.getLocalState(); 
     // Handles each of the expected events 
     switch(action) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       return true; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       return true; 
      case DragEvent.ACTION_DRAG_LOCATION: 
       Log.d("point", touchPosition.toString()); 
       if (touchPosition.y > (absoluteBottom + mScrollDistance - 350)){ 
        Log.d("bottom", "greater"); 
        Log.d("actionbar", String.format("%s", actionBarHeight())); 
        homeScroll.scrollBy(0, 30); 
       } 
       if (touchPosition.y < (actionBarHeight + 350)){ 
        Log.d("top", "greater"); 
        homeScroll.scrollBy(0, -30); 
       } 
       break; 

getTouchPositionFromDragEvent Méthode

public static Point getTouchPositionFromDragEvent(View item, DragEvent event) { 
    Rect rItem = new Rect(); 
    item.getGlobalVisibleRect(rItem); 
    return new Point(rItem.left + Math.round(event.getX()), rItem.top + Math.round(event.getY())); 
} 

onScrollChangedListener Méthode

homeScroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
     @Override 
     public void onScrollChanged() { 
      mScrollDistance = homeScroll.getScrollY(); 
      int[] coords = new int[2]; 
      homeScroll.getLocationOnScreen(coords); 
      absoluteTop = coords[1]; 
      absoluteBottom = coords[1] + homeScroll.getHeight(); 
     } 
    }); 
+0

je suppose une meilleure question pourrait être, comment puis-je obtenir la position absolue de la vue entraînée, ce qui signifie que peu importe à quel point je défiler, la position y sera quelque part entre le absoluteTop et absoluteBottom. Pour l'instant, getTouchPositionFromDragEvent renvoie les coordonnées x, y pour l'ensemble de la mise en page, en tenant compte du défilement. –

Répondre

0

Il est toujours les meilleures pratiques à mettre en œuvre l'attribut scrolling dans le fichier xml. Ce que vous voulez faire défiler dans le côté. ou dans Palette vous trouverez l'option scrollview du défilement vertical et horizontal. Il vous suffit de glisser et déposer à l'endroit où vous voulez le placer.

<ScrollView 
 
    xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent"> 
 
    
 
    </ScrollView>

+0

J'ai déjà scrollview implémenté dans mon xml. Je peux très bien faire défiler mon contenant. Mon problème est quand je traîne une vue et essaie de faire défiler. –