2011-10-03 14 views
7

HorizontalScrollViewに浮動矢印を追加すると、現在のビューよりも多くのアイテムがあることをユーザーに知らせることができます。最大Horizo​​ntalScrollViewスクロール量を取得

私が必要とするのは、表示が最大にスクロールされたかどうかを確認する方法です。あなたは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

に次のコードを入れて、XMLが膨張された後、それはonCreateView幅だために「0」を与えます。 'findById'を実行しても、0の幅が与えられます。理由はまったくありません。しかし、良いアイデア! – Graeme

+2

oncreateは、ビューが実際に画面に描画される前に発生します。レイアウトが描画された後にしか正しい幅を取得できません。私は私の無回答を更新する。 – blessenm

+0

偉大な答え、説明とそれが配置された後の実際の幅を取得する方法! – Graeme

関連する問題