6

以下に示すレイアウトを使用して、Horizo​​ntalScrollView を使用してスクロール可能な水平メニューを作成しようとしています。メニューは、前/次の矢印ボタンまたはフリングを使用してスクロールできます。Horizo​​ntalScrollView が一方の端に到達したら、同じ端の矢印を非表示にしたいと思います (下の画像では、左矢印を非表示にしたいと思います)。

Horizo​​ntalScrollView が終了したことを検出するにはどうすればよいですか?

ありがとう

ここに画像の説明を入力

<RelativeLayout android:background="@drawable/bg_home_menu"
    android:layout_width="fill_parent" android:layout_height="45dp">
    <ImageView android:id="@+id/previous" android:src="@drawable/arrow_l"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />

    <ImageView android:id="@+id/next" android:src="@drawable/arrow_r"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

    <HorizontalScrollView android:id="@+id/horizontalScroll"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:scrollbars="none" android:fadingEdgeLength="30dp" android:layout_toLeftOf="@id/next"
        android:layout_toRightOf="@id/previous" >

        <LinearLayout android:id="@+id/home_menu"
            android:orientation="horizontal" android:layout_width="wrap_content"
            android:layout_height="fill_parent" android:gravity="center_vertical">

            <Button android:id="@+id/btn_home" android:background="@drawable/btn_home_menu_on"
                android:layout_height="35dp" android:layout_width="wrap_content" android:focusable="true"
                android_clickable="false" android:text="@string/menu_home" android:textColor="#FFFFFF" android:tag="-1"/>

            <!-- More are added dynamically -->

        </LinearLayout>

    </HorizontalScrollView>
</RelativeLayout>
4

2 に答える 2

4

Horizo​​ntalScrollView のスクロール リスナーはありません。あなたができることは、それに OnTouchListener を追加することです。これは、ユーザーがスクロールすると継続的に起動し、そのたびに int を返す getScrollX メソッドを使用できます。

0 は一番左を意味し、一番右 (最大スクロール量) を見つけるには、水平スクロール ビューの子ビューの幅を見つける必要があります。これは addOnGlobalLayoutListener を使用して検出されます。それ以外の場合、幅は onCreate メソッド内で常に 0 になります。

このコードを onCreate メソッドに入れます

final HorizontalScrollView hs = (HorizontalScrollView)findViewById(R.id.scroll);

ViewTreeObserver vto = hs.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        hs.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        maxScrollX = hs.getChildAt(0) 
                .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth();

    } 
});        

hs.setOnTouchListener(new OnTouchListener() {           
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.e("ScrollValue", Integer.toString(hs.getScrollX()));
  if(hs.getScrollX() == maxScrollX){
      Log.e("MaxRight", "MaxRight");    
  }
  return false;
    }
});
于 2011-10-06T09:16:36.670 に答える
3

スクローラー内の LinearLayout のgetScrollX()を使用して、画面の左端のコーナーを特定します。0 の場合、左矢印を無効にする必要があります。

右矢印の場合、描画矩形の幅を取得し、 getScrollX() を追加して、それを getMeasuredWidth () と比較します。同じであれば、右にあり、右矢印は必要ありません。

したがって、コードは次のようになります。

if (homeMenu.getScrollX()==0) {
  hideLeftArrow();
} else {
  showLeftArrow();
}
if (homeMenu.getDrawingRect().right == homeMenu.getMeasuredWidth()) {
  hideRightArrow();
} else {
  showRightArrow();
}

もちろん、これをイベントリスナーに入れる必要があります。上記のチェックを実行するために onScroll() メソッドを上書きして、独自の Horizo​​ntalScrollView クラスを使用することしか考えられません。この投稿を参照してください。

于 2011-10-06T09:53:22.683 に答える