2011-10-03 14 views
7

Dodaję pływające strzałki do mojego HorizontalScrollView, które pozwolą użytkownikowi wiedzieć, że jest więcej elementów poza bieżącym widokiem.Uzyskaj maksymalną wartość HorizontalScrollView Ilość przewijania

Potrzebuję, jak stwierdzić, czy widok został przewinięty do maksimum. Myślałbyś, że metoda ta dałaby ci to - nie, w moim kodzie daje mi szerokość Widoku. Idź, dlaczego? Oto mój kod - ładne i proste:

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; 
     } 
    }); 

Wyjście z powyższego debugowania:

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 jest maksymalna w tym przypadku)

Odpowiedz

19

Dziecko poziomej Scrollview powinien mieć poprawna szerokość. Wypróbuj to, aby uzyskać maksymalną wartość przewijania.

Umieść następujący kod w swoim onCreate metody

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

daje „0” to szerokość w onCreateView po xml została zawyżona. Nawet robienie 'findById' daje szerokość 0 - absolutnie nie ma pojęcia dlaczego. Dobry pomysł! – Graeme

+2

oncreate jest uruchamiany, zanim widoki będą faktycznie rysowane na ekranie. Możesz uzyskać poprawną szerokość tylko po narysowaniu układu. Ive aktualizuje moje unanswer. – blessenm

+0

Świetna odpowiedź, wyjaśnienie i sposób uzyskania faktycznej szerokości widoku po jego ułożeniu! – Graeme

Powiązane problemy