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)
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
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
¡Gran respuesta, explicación y forma de obtener el ancho real de una vista después de que se haya trazado! – Graeme