2011-10-06 68 views
5

Tôi đang cố gắng tạo một menu ngang có thể cuộn bằng HorizontalScrollView bằng cách sử dụng bố cục được hiển thị bên dưới. Trình đơn có thể cuộn được bằng các nút mũi tên trước đó/tiếp theo hoặc khi trượt. Khi HorizontalScrollView đạt đến một đầu, tôi muốn mũi tên ở cùng một đầu bị ẩn (trong hình dưới đây tôi muốn mũi tên trái bị ẩn).HorizontalScrollView với các mũi tên

Làm cách nào để phát hiện thấy HorizontalScrollView đã kết thúc?

Cảm ơn

enter image description here

<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> 

Trả lời

3

Sử dụng getScrollX() của LinearLayout bên scroller bạn để xác định đó là tận cùng bên trái góc trên màn hình. Nếu đó là 0 thì mũi tên trái sẽ bị tắt.

Đối với mũi tên phải, hãy lấy chiều rộng của drawing rectangle, thêm getScrollX() và so sánh với getMeasuredWidth(), nếu giống nhau, bạn đang ở bên phải, không cần mũi tên phải.

Vì vậy, mã của bạn sẽ trông như thế này:

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

Tất nhiên bạn sẽ phải đặt điều này trong một event listener. Tôi chỉ có thể nghĩ đến việc sử dụng lớp HorizontalScrollView của riêng bạn, với phương thức onScroll() được ghi đè để thực hiện các kiểm tra ở trên, xem this post.

4

Không có người nghe cuộn cho HorizontalScrollView. Những gì bạn có thể làm là thêm một OnTouchListener vào nó Điều này sẽ cháy liên tục khi người dùng cuộn, và mỗi lần bạn có thể sử dụng phương thức getScrollX trả về int.

Bây giờ 0 có nghĩa là nhiều nhất bên trái của nó, để tìm đúng nhất (số lượng cuộn tối đa), bạn cần phải tìm chiều rộng của chế độ xem con của chế độ xem cuộn horzontal. Được tìm thấy bằng cách sử dụng các addOnGlobalLayoutListener khác chiều rộng sẽ luôn là 0 bên trong phương pháp onCreate

Đặt mã này trong phương thức 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; 
    } 
}); 
+0

Xin lỗi, tôi không hiểu cách giải quyết vấn đề của mình ... – jul

+1

Tôi đã cập nhật câu trả lời của mình. Nếu điều này không hoạt động, điều này có thể giúp ích cho http://stackoverflow.com/questions/3948934/synchronise-scrollview-scroll-positions-android – blessenm

+1

+1 Thanx rất nhiều, Làm việc như Charm. Thực sự rất hữu ích. –

Các vấn đề liên quan