2011-10-06 19 views
5

Estoy tratando de crear un menú horizontal desplazable usando HorizontalScrollView utilizando el diseño que se muestra a continuación. El menú se puede desplazar usando los botones de flecha anterior/siguiente o en fling. Cuando HorizontalScrollView llegue a un extremo, me gustaría que la flecha en el mismo extremo se oculte (en la imagen que se muestra a continuación me gustaría que la flecha izquierda esté oculta).HorizontalScrollView con flechas

¿Cómo puedo detectar que el HorizontalScrollView ha llegado a su fin?

Gracias

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> 

Respuesta

3

Uso getScrollX() del LinearLayout dentro de su rueda de desplazamiento para determinar cuál es la más a la izquierda esquina en la pantalla. Si es 0, entonces la flecha izquierda debería estar deshabilitada.

Para obtener la flecha derecha, recupere el ancho de drawing rectangle, agregue getScrollX() y compárelo con getMeasuredWidth(); si es el mismo, está a la derecha, sin necesidad de la flecha hacia la derecha.

Así que el código se vería así:

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

Por supuesto, tendrá que poner esto en un detector de eventos. Solo puedo pensar en usar su propia clase HorizontalScrollView, con el método onScroll() sobrescrito para realizar las comprobaciones anteriores, consulte this post.

4

No hay oyente de desplazamiento para el HorizontalScrollView. Lo que puede hacer es agregarle un OnTouchListener. Esto disparará continuamente cuando el usuario se desplaza, y cada vez puede usar el método getScrollX que devuelve el int.

Ahora 0 significa que está más a la izquierda, para encontrar el más correcto (cantidad máxima de desplazamiento), necesita encontrar el ancho de la vista secundaria de la vista de desplazamiento horzontal. Que se encuentra utilizando el addOnGlobalLayoutListener demás el ancho será siempre 0 dentro del método onCreate

Pon este código en el método 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

Lo siento, no entiendo cómo puede resolver mi problema ... – jul

+1

He actualizado mi respuesta. Si esto no funciona, esto podría ayudar http://stackoverflow.com/questions/3948934/synchronise-scrollview-scroll-positions-android – blessenm

+1

+1 Gracias mucho, trabajando como un encanto. Realmente muy útil. –

Cuestiones relacionadas