Obtenga la cantidad de desplazamiento HorizontalScrollView máxima

Estoy agregando flechas flotantes a mi HorizontalScrollView lo que permitirá al usuario saber que hay más elementos fuera de la vista actual.

Lo que necesito es saber si la vista se ha desplazado a su máximo. Usted habría pensado que el método getMaxScrollAmount() le daría esto – no lo hace, 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 anterior:

 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)

El hijo de la vista de desplazamiento horizontal debe tener el ancho correcto. Prueba esto

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

Esta debe ser la cantidad máxima de desplazamiento.

Ponga el código siguiente 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())); } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.