2011-10-03 10 views
7

Estoy agregando flechas flotantes a mi HorizontalScrollView que permitirán al usuario saber que hay más elementos fuera de la vista actual.Obtiene la cantidad de desplazamiento HorizontalScrollView máxima

Lo que necesito es cómo saber si la vista se ha desplazado al máximo. Habría pensado que el método getMaxScrollAmount() le daría esto; no es así, en mi código me da el ancho de la Vista. Ve por qué. Aquí está mi código - agradable y simple:

final ImageView leftArrow = (ImageView) toReturn.findViewById(R.id.leftArrow); 
    final ImageView rightArrow = (ImageView) toReturn.findViewById(R.id.rightArrow); 

    final HorizontalScrollView scrollView = (HorizontalScrollView) toReturn.findViewById(R.id.actionBarHoriztonalScroll); 


    final GestureDetector gd = new GestureDetector(new SimpleOnGestureListener() { 
     @Override 
     public boolean onScroll(MotionEvent e1, 
           MotionEvent e2, 
           float distanceX, 
           float distanceY) { 
      if(scrollView.getScrollX() == 0) { 
       leftArrow.setVisibility(View.GONE); 
      } else { 
       leftArrow.setVisibility(View.VISIBLE); 
      } 
      if(scrollView.getScrollX() == scrollView.getMaxScrollAmount() || 
       scrollView.getMaxScrollAmount() == 0) { 
       rightArrow.setVisibility(View.GONE); 
      } else { 
       rightArrow.setVisibility(View.VISIBLE); 
      } 

      Log.v(ClientDetailsFragment.class.getSimpleName(), "max: " + scrollView.getMaxScrollAmount() + 
                  "current: " + scrollView.getScrollX()); 
      return super.onScroll(e1, e2, distanceX, distanceY); 
     } 
    }); 

    scrollView.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View arg0, MotionEvent ev) { 
      gd.onTouchEvent(ev); 
      return false; 
     } 
    }); 

salida de la depuración arriba:

10-03 14:36:16.343: VERBOSE/(20508): max: 240 current: 126 
10-03 14:36:16.363: VERBOSE/(20508): max: 240 current: 127 
10-03 14:36:16.386: VERBOSE/(20508): max: 240 current: 132 
10-03 14:36:16.398: VERBOSE/(20508): max: 240 current: 143 
10-03 14:36:16.417: VERBOSE/(20508): max: 240 current: 149 
10-03 14:36:16.433: VERBOSE/(20508): max: 240 current: 152 
10-03 14:36:16.449: VERBOSE/(20508): max: 240 current: 152 
10-03 14:36:16.468: VERBOSE/(20508): max: 240 current: 152 

(152 es el máximo en este caso)

Respuesta

19

El niño de la ScrollView horizontales deben tener la ancho correcto Pruebe esto

Log.e("ScrollWidth",Integer.toString(horizontalScrollview.getChildAt(0).getMeasuredWidth()- 
     getWindowManager().getDefaultDisplay().getWidth())); 

Esta debería ser la cantidad máxima de desplazamiento.

Coloque el siguiente código en su método onCreate

ViewTreeObserver vto = scrollView.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     Log.e("ScrollWidth",Integer.toString(horizontalScrollview.getChildAt(0) 
       .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth())); 

    } 
}); 
+0

Da "0" por su anchura en onCreateView después de que el XML se ha inflado. Incluso haciendo un 'findById' da ancho de 0 - absolutamente ni idea de por qué. ¡Buena idea! – Graeme

+2

oncreate se activa antes de que las vistas se dibujen realmente en la pantalla. Solo puede obtener el ancho correcto después de dibujar el diseño. He actualizado mi respuesta. – blessenm

+0

¡Gran respuesta, explicación y forma de obtener el ancho real de una vista después de que se haya trazado! – Graeme

Cuestiones relacionadas