2011-10-06 10 views
5

Sto cercando di creare un menu orizzontale scorrevole utilizzando HorizontalScrollView utilizzando il layout mostrato di seguito. Il menu è scorrevole utilizzando i tasti freccia precedente/successivo o su fling. Quando HorizontalScrollView raggiunge un'estremità mi piacerebbe che la freccia alla stessa estremità fosse nascosta (nell'immagine mostrata sotto vorrei la freccia sinistra da nascondere).HorizontalScrollView with arrows

Come posso rilevare che HorizontalScrollView ha raggiunto la fine?

Grazie

enter image description here

<RelativeLayout android:background="@drawable/bg_home_menu" 
    android:layout_width="fill_parent" android:layout_height="45dp"> 
    <ImageView android:id="@+id/previous" android:src="@drawable/arrow_l" 
     android:layout_height="14dp" android:layout_width="10dp" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" /> 

    <ImageView android:id="@+id/next" android:src="@drawable/arrow_r" 
     android:layout_height="14dp" android:layout_width="10dp" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" /> 

    <HorizontalScrollView android:id="@+id/horizontalScroll" 
     android:layout_width="fill_parent" android:layout_height="fill_parent" 
     android:scrollbars="none" android:fadingEdgeLength="30dp" android:layout_toLeftOf="@id/next" 
     android:layout_toRightOf="@id/previous" > 

     <LinearLayout android:id="@+id/home_menu" 
      android:orientation="horizontal" android:layout_width="wrap_content" 
      android:layout_height="fill_parent" android:gravity="center_vertical"> 

      <Button android:id="@+id/btn_home" android:background="@drawable/btn_home_menu_on" 
       android:layout_height="35dp" android:layout_width="wrap_content" android:focusable="true" 
       android_clickable="false" android:text="@string/menu_home" android:textColor="#FFFFFF" android:tag="-1"/> 

      <!-- More are added dynamically --> 

     </LinearLayout> 

    </HorizontalScrollView> 
</RelativeLayout> 

risposta

3

Uso getScrollX() del LinearLayout all'interno del vostro scroller per determinare quale è il più a sinistra angolo sullo schermo. Se è 0, la freccia sinistra dovrebbe essere disabilitata.

Per la freccia a destra, recuperare larghezza s' il drawing rectangle, aggiungere getScrollX() e che, per confrontare getMeasuredWidth(), se è lo stesso, sei a destra, non c'è bisogno per la freccia a destra.

Quindi il codice sarà simile a questa:

if (homeMenu.getScrollX()==0) { 
    hideLeftArrow(); 
} else { 
    showLeftArrow(); 
} 
if (homeMenu.getDrawingRect().right == homeMenu.getMeasuredWidth()) { 
    hideRightArrow(); 
} else { 
    showRightArrow(); 
} 

Naturalmente si dovrà mettere questo in un listener di eventi. Posso solo pensare di usare la tua classe HorizontalScrollView, con il metodo onScroll() sovrascritto per eseguire i controlli sopra, vedi this post.

4

Non v'è alcun ascoltatore di scorrimento per il HorizontalScrollView. Quello che puoi fare è aggiungere un OnTouchListener ad esso. Questo si accenderà continuamente quando l'utente scorre, e ogni volta puoi usare il metodo getScrollX che restituisce l'int.

Ora 0 indica la sua parte più a sinistra, per trovare la parte più corretta (quantità di scorrimento massima), è necessario trovare la larghezza della vista secondaria della vista di scorrimento orizzontale. Che si trova utilizzando l'addOnGlobalLayoutListener altrimenti la larghezza sarà sempre 0 all'interno del metodo onCreate

Mettere questo codice nel metodo onCreate

final HorizontalScrollView hs = (HorizontalScrollView)findViewById(R.id.scroll); 

ViewTreeObserver vto = hs.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     hs.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     maxScrollX = hs.getChildAt(0) 
       .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth(); 

    } 
});   

hs.setOnTouchListener(new OnTouchListener() {   
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.e("ScrollValue", Integer.toString(hs.getScrollX())); 
    if(hs.getScrollX() == maxScrollX){ 
     Log.e("MaxRight", "MaxRight");  
    } 
    return false; 
    } 
}); 
+0

Scusa, non capisco come possa risolvere il mio problema ... – jul

+1

Ho aggiornato la mia risposta. Se questo non funziona, potrebbe essere utile http://stackoverflow.com/questions/3948934/synchronise-scrollview-scroll-positions-android – blessenm

+1

+1 Grazie, Funzionando come Charm. Davvero molto utile. –

Problemi correlati