2010-03-20 27 views
6

Tôi đang cố gắng đồng bộ hóa các vị trí của hai ScrollViews. Tôi đang cố gắng để làm điều này để hiển thị một danh sách hướng dẫn tv.Đồng bộ hóa vị trí của hai chế độ xem ScrollView

Tôi đã tạo một lớp tùy chỉnh mở rộng RelativeLayout để hiển thị hướng dẫn. Bố cục tương đối này có bốn trẻ em: một lần xem hình ảnh ở góc trên cùng bên trái, một HorizontalScrollView để hiển thị các tiêu đề cột ở trên cùng bên phải, một ScrollView để hiển thị các tiêu đề hàng ở dưới cùng bên trái và một ScrollView ở góc dưới cùng bên phải. . ScrollView này sau đó chứa một HorizontalScrollView, mà lần lượt chứa một LinearLayout với nhiều khung nhìn con hiển thị dữ liệu. Tôi hy vọng điều này giải thích rõ ràng, nhưng đây là một sơ đồ để làm cho nó rõ ràng hơn:

____________ 
|__|___hsv___| 
| |   | 
| | sv -> | 
| | hsv -> | 
|sv| ll -> | 
| | etc | 
| |   | 
|__|_________| 

tôi thiết lập nó như thế này bởi vì tôi muốn hướng dẫn danh sách để cuộn cả chiều ngang và chiều dọc, nhưng không có xem di chuyển mà thực hiện điều này . Ngoài ra, tôi muốn các tiêu đề hàng và cột hiển thị bất kể vị trí danh sách hướng dẫn là gì, nhưng tôi muốn chúng được xếp hàng đúng cách. Vì vậy, tôi đang cố gắng tìm một cách để đồng bộ hóa các vị trí của hai hsv, và cũng đồng bộ hóa các vị trí của hai sv. Tôi cũng đang cố gắng để làm điều đó theo cách mà tránh chỉ cần chạy một trình xử lý mỗi vài phần nghìn giây để thăm dò ý kiến ​​một lần xem và gọi scrollTo trên khác.

Tôi không chắc chắn rằng đây là cách tốt nhất để làm điều đó, nhưng đây là những gì tôi đã đưa ra. Nếu bất cứ ai có bất kỳ đề xuất nào khác, xin vui lòng cảm thấy tự do!

+0

@Billy ... bạn có thể tìm giải pháp cho việc này không? –

Trả lời

1

Sẽ không đáng để triển khai onTouchEvent(MotionEvent me) trong tất cả các bảng của bạn? Khi một trong các ô của bạn được cuộn, phương thức này sẽ được gọi và có thể đảm bảo rằng tất cả các bảng khác được đồng bộ hóa.

1

Xử lý các sự kiện chạm không hoạt động 100%. Số lượng cuộn trong các chế độ xem khác nhau có thể không đồng bộ hóa luôn.

1

Xử lý các sự kiện liên lạc là không đủ, bởi vì nếu bạn làm một flinge nhanh các di chuyển tiếp tục trong một thời gian sau khi phát hành khi chạm vào. Giải pháp là ghi đè lên phương thức computeScroll(). Có một cái nhìn tại https://github.com/chrisjenx/ParallaxScrollView làm thế nào nó được thực hiện ở đó.

0

Bạn có thể có một cái nhìn vào bài đăng này: Link

gì anh chàng này đang thực sự làm ông tạo ScrollViews tùy chỉnh và ghi đè phương pháp onScrollChanged, bổ sung thêm một người biết lắng nghe và sau đó đồng bộ hóa chúng trước họ bị thu hút vào màn hình .

Giờ bạn có thể thêm khung chính làm ScrollView trong HorizontalScrollView. Thanh bên trái sẽ là HorizontalScrollView và trên cùng là ScrollView. Sau đó, bạn đăng ký chính ScrollViewHorizontalScrollView chính để hai riêng biệt ScrollManagers (xem liên kết ở trên).

Sau đó, vô hiệu hóa các cuộn của hsv và sv và thêm chúng vào thích hợp ScrollManagers. Sau đó, mọi thứ sẽ hoạt động tốt.

-

PS. Nếu bạn muốn sử dụng chỉ là người nghe chính mình và không phải là ScrollManager, bạn sẽ có một sự chậm trễ đồng bộ trong tổng số 1 frame.

0

Tôi đã đạt được cùng một bố cục bằng cách thực hiện những điều dưới đây.

Bạn sẽ thấy SyncedScrollView trong xml là scrollview tùy chỉnh được sử dụng để đồng bộ hóa hai lần xem cuộn.

Bạn cần tham khảo bên dưới hai câu trả lời của lưu lượng truy cập stackoverflow.

  1. SynchedScrollView andig answer
  2. tối ưu hóa SynchedScrollView my answer

kiểm tra dưới đây xml

<RelativeLayout 
    android:id="@+id/activity_main_linear_before_all_scroll" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/activity_main_empty_box" 
     android:layout_width="50dp" 
     android:layout_height="30dp" 
     android:text="xx" 
     android:gravity="center" /> 

    <com.example.SyncedScrollView 
     android:id="@+id/activity_main_observable_scrollview_1" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/activity_main_empty_box" 
     android:fadeScrollbars="false" 
     android:overScrollMode="never" 
     android:scrollbars="none"> 

     <LinearLayout 
      android:id="@+id/activity_main_linear_left_headers" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="50dp" 
       android:layout_height="30dp" 
       android:gravity="center" 
       android:padding="5dp" 
       android:text="row 1" /> 

      <TextView 
       android:layout_width="50dp" 
       android:layout_height="30dp" 
       android:gravity="center" 
       android:padding="5dp" 
       android:text="row 2" /> 

      <TextView 
       android:layout_width="50dp" 
       android:layout_height="30dp" 
       android:gravity="center" 
       android:padding="5dp" 
       android:text="row 3" /> 

     </LinearLayout> 

    </com.example.SyncedScrollView> 

    <HorizontalScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_toEndOf="@+id/activity_main_empty_box" 
     android:layout_toRightOf="@+id/activity_main_empty_box" 
     android:fadeScrollbars="false" 
     android:overScrollMode="never"> 

     <RelativeLayout 
      android:id="@+id/activity_main_body_relative" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

      <LinearLayout 
       android:id="@+id/activity_main_top_headers" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal"> 

       <TextView 
        android:layout_width="50dp" 
        android:layout_height="30dp" 
        android:gravity="center" 
        android:padding="5dp" 
        android:text="column 1" /> 

       <TextView 
        android:layout_width="50dp" 
        android:layout_height="30dp" 
        android:gravity="center" 
        android:padding="5dp" 
        android:text="column 2" /> 

       <TextView 
        android:layout_width="50dp" 
        android:layout_height="30dp" 
        android:gravity="center" 
        android:padding="5dp" 
        android:text="column 3" /> 

      </LinearLayout> 

      <com.example.SyncedScrollView 
       android:id="@+id/activity_main_observable_scrollview_2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_below="@+id/activity_main_top_headers" 
       android:fadeScrollbars="false" 
       android:overScrollMode="never" 
       android:scrollbars="vertical"> 

       <LinearLayout 
        android:id="@+id/activity_main_body" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:orientation="vertical"> 

        <LinearLayout 
         android:id="@+id/activity_main_body_row_1" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:orientation="horizontal"> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="1,1" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="1,2" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="1,3" /> 

        </LinearLayout> 

        <LinearLayout 
         android:id="@+id/activity_main_body_row_2" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:orientation="horizontal"> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="2,1" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="2,2" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="2,3" /> 

        </LinearLayout> 

        <LinearLayout 
         android:id="@+id/activity_main_body_row_3" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:orientation="horizontal"> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="3,1" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="3,2" /> 

         <TextView 
          android:layout_width="50dp" 
          android:layout_height="30dp" 
          android:gravity="center" 
          android:padding="5dp" 
          android:text="3,3" /> 

        </LinearLayout> 

       </LinearLayout> 

      </com.example.SyncedScrollView> 

     </RelativeLayout> 

    </HorizontalScrollView> 

</RelativeLayout> 

Mỗi tế bào là TextView đây. Vì vậy, bạn có thể đặt nền có thể drawable để vẽ hộp (Nó sẽ giống như bảng)

Ngoài ra bạn có thể thêm tiêu đề trái, tiêu đề đầu và TextView cơ thể động để tạo bảng động.

Đây là ảnh chụp màn hình của bố trí This is screen shot of layout

Xin lỗi vì tiếng Anh thuần túy của tôi.

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