2013-10-27 23 views
14

So verwende ich die Sliding Up Panel Library in meiner Anwendung, und ich versuche, eine ScrollView innerhalb der Schiebeplatte zu implementieren. Da sowohl das Schiebefenster als auch das ScrollView durch vertikale Scrolls gesteuert werden, habe ich einige Probleme.Scroll-Ereignis von gleitender Ansicht zu ScrollView übertragen - Schiebe-Panel mit ScrollView wie Google Maps

Ich habe es teilweise funktioniert, indem ich den dragview des Panels änderte, sobald das Panel ganz nach oben geschoben wurde und wenn die ScrollView nach oben gescrollt wurde.

enter image description here

Das Problem, das ich jetzt mit Blick auf bin ist, dass beim Scrollen das Panel das Scrollen nach oben überträgt sich nicht auf die Scrollview, wie es in Google Maps der Fall ist. wenig schwer zu erklären, so das Video hier: www.youtube.com/watch?v=9MUsmQzusX8&feature=youtu.be

Dies ist die Panel Dia Hörer:

... 
slidePanel.setEnableDragViewTouchEvents(true); 
slidePanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { 

    @Override 
    public void onPanelSlide(View panel, float slideOffset) { 

      // Change the dragview to panelheader when panel is fully expanded 
      // I'm doing this here instead of in onPanelExpanded, 
      // because onPanelExpanded first gets called once scroll 
      // is released. 
      if (slideOffset <= 0) { 
       slidePanel.setDragView(layoutPanelTop); 
      } 

      // If the panel is not fully expanded set the whole 
      // panel as dragview 
      else if(slideOffset > 0) { 
       slidePanel.setDragView(layoutPanel); 
      } 
     } 
    } 

    @Override 
    public void onPanelExpanded(View panel) { 
     // layout.setDragView(layoutPanelTop); 

     panelCollapsed = false; 
     panelExpanded = true; 
     panelAnchored = false; 

     Log.v("TAG, "panelExpanded"); 

    } 

    @Override 
    public void onPanelCollapsed(View panel) { 
     slidePanel.setDragView(layoutPanel); 

     panelCollapsed = true; 
     panelExpanded = false; 
     panelAnchored = false; 

     Log.v(TAG, "panelCollapsed"); 
    } 

    @Override 
    public void onPanelAnchored(View panel) { 
     slidePanel.setDragView(layoutPanel); 

     panelCollapsed = false; 
     panelExpanded = false; 
     panelAnchored = true; 

     Log.v(TAG, "panelAnchored"); 
    } 
}); 

Und ich habe durch die Erweiterung Scroll einen voll funktionsfähigen Scroll Zuhörer zu schaffen verwaltet, die Scroll-Richtung und onDown und onUp Bewegungsereignisse kann erkennen:

private boolean atScrollViewTop = false; 

@Override 
public void onScrollChanged(int scrollY) { 
    scrollY = Math.min(mMaxScrollY, scrollY); 
    if (scrollY <= 0) { 
     Log.v("myTag", "You at scrollview top"); 
     atScrollViewTop = true; 

    } else { 
     atScrollViewTop = false; 
    } 
    mScrollSettleHandler.onScroll(scrollY); 

    switch (mState) { 
     case STATE_SCROLL_UP: 
      if (panelExpanded && atScrollViewTop) { 
       slidePanel.setDragView(layoutPanel); 
      } else { 
       slidePanel.setDragView(layoutPanelTop); 
      } 
      Log.v("myTag", "scrolling up"); 
      break; 
     case STATE_SCROLL_DOWN: 
      slidePanel.setDragView(layoutPanelTop); 
      Log.v("myTag", "scrolling down"); 
      break; 
    } 
} 

@Override 
public void onDownMotionEvent() { 

} 

@Override 
public void onUpOrCancelMotionEvent() { 

} 

ich habe mit dieser den letzten zwei Tage zu kämpfen .. So hoffen wirklich auf einigen Zeigern auf am wenigsten. Vielen Dank im Voraus. Grüße Jakob Harteg.

+0

Jakob - Hattest du Glück dabei zu arbeiten? Jeder Rat würde sehr geschätzt werden! – Kyle

+0

@Kyle nein, leider nicht. Verbringe Stunden damit, Stunden zu versuchen, aber nie weiter als das, was das Video zeigt.Also habe ich mein Layout neu gestaltet. – Jakob

+0

@ Jakob- Eigentlich habe ich Listview in SlidingUpPanel. Auf jedem Listenansicht-Element befindet sich eine Schaltfläche. Ich möchte Panel auf Knopf klicken, klicken Sie auf Detailansicht. Ich denke setDragView() ist eine Methode zum Reduzieren von Panel. Aber ich kann nicht verstehen, wie kann ich in meiner Adapterklasse implementieren? Bitte sag mir wie ich das machen kann. Danke im Voraus. – Lawrance

Antwort

0

Ich schätze ScrollView ist Kind der SlidingPanel?
In diesem Fall überschreiben Sie onInterceptTouchEvent zu Ihrem SlidingPanel, um das onTouch Ereignis Ihrer ScrollView wenn y = 0 abzufangen.

onInterceptTouchEvent führt die folgenden zwei:

  • Kind bekommt Ereignis Aktion abbrechen
  • Mutter onTouch
+0

Noch kann es nicht zur Arbeit kommen .. Könntest du mir ein paar Hinweise geben, die ein wenig mehr Code betreffen (Ich bitte dich nicht, meine App zu schreiben, ich bin nur stecken ..). Hier ist der SlidingPanel-Code (https://github.com/umano/AndroidSlidingUpPanel/blob/master/library/src/com/sothree/slidinguppanel/SlidingUpPanelLayout.java), der OnInterceptTouchEvent in Zeile 544 überschreibt, es ist hier, nehme ich an irgendeine Art von Modifikation zu machen, oder? – Jakob

+0

Hallo. Ich möchte das Gleiche tun. Kannst du erzählen, wie du es gemacht hast? Es könnte mir Kopfschmerzen ersparen! Tx –

+0

leider habe ich es nie funktioniert ... – Jakob

7

Entschuldigung für die Verzögerung der Veranstaltung Trog bekommen .. ich die Lösung finden.

image = (ImageView) findViewById(R.id.image); //Layout to slide 

SlidingUpPanelLayout layout = (SlidingUpPanelLayout) 
findViewById(R.id.sliding_layout); 

layout.setDragView(image); 
/*This method sets the layout to be used only 
in the sliding panel, while all layouts children 
are able to perform other functions such as scrolling */ 

Und das ist das Layout

<..SlidingUpPanelLayout 
    android:id="@+id/sliding_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:gravity="center" /> 

     <LinearLayout 
      android:id="@+id/slide_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <ImageView 
       android:id="@+id/image" 
       android:layout_width="match_parent" 
       android:layout_height="35dp" 
       android:background="@drawable/ec_image"/> 

      <!-- FINALLY SCROLLVIEW --> 
      <ScrollView .... /> 

Hoffe, dass es nützlich ist.

+0

Nun, das ist eine Art Basis meines Codes, und ich versuche, eine viel komplexere Benutzererfahrung zu implementieren, als das, was dies bietet. Aber danke trotzdem – Jakob

0

Ich weiß nicht, ob ich zu spät gekommen bin, aber ich hart einige Tage nach der Arbeit habe festgestellt, dass AndroidSlidingUp Panel ein Verfahren hat namens setScrollView, der Scroll-Ereignisse korrekt behandelt.

Ich hoffe, dass dieser Beitrag nützlich sein wird, weil ich viel Zeit mit der Suche verbrachte und ich habe keinen Tipp gefunden, der mir hilft.