2011-10-03 25 views
7

मैं अपने HorizontalScrollView पर फ़्लोटिंग तीर जोड़ रहा हूं जो उपयोगकर्ता को यह बताएगा कि वर्तमान दृश्य के बाहर अधिक आइटम हैं।अधिकतम क्षैतिज स्क्रॉलव्यू स्क्रॉल राशि प्राप्त करें

मुझे क्या चाहिए यह बताना है कि दृश्य को अधिकतम तक स्क्रॉल किया गया है या नहीं। आपने सोचा होगा कि विधि getMaxScrollAmount() आपको यह देगी - ऐसा नहीं है, मेरे कोड में यह मुझे दृश्य की चौड़ाई देता है। क्यों आंकड़े जाओ। यहाँ मेरी कोड है - अच्छा और सरल: उपरोक्त डिबगिंग से

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

आउटपुट:

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 

उत्तर

19

क्षैतिज scrollview के बच्चे होना चाहिए (152 इस मामले में अधिकतम है) सही चौड़ाई इसे आजमाएं

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

यह अधिकतम स्क्रॉल राशि होनी चाहिए।

अपने 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

देता है "0" के लिए यह onCreateView में चौड़ाई के बाद एक्सएमएल फुलाया गया है। यहां तक ​​कि 'findById' भी 0 की चौड़ाई देता है - बिल्कुल नहीं पता क्यों। अच्छा विचार हालांकि! स्क्रीन पर वास्तव में खींचे जाने से पहले – Graeme

+2

ऑनक्वेट निकाल दिया जाता है। लेआउट तैयार किए जाने के बाद आप केवल सही चौड़ाई प्राप्त कर सकते हैं। मैं अपने unanswer अद्यतन। – blessenm

+0

ग्रेट उत्तर, स्पष्टीकरण और इसे देखने के बाद दृश्य की वास्तविक चौड़ाई प्राप्त करने का तरीका! – Graeme

संबंधित मुद्दे