2010-03-20 69 views
6

我想同步兩個ScrollViews的位置。我試圖做到這一點顯示電視指南列表。同步兩個ScrollView視圖的位置

我已經創建了一個擴展RelativeLayout來顯示指南的自定義類。此相對佈局有四個子項:左上角的imageview,右上角顯示列標題的Horizo​​ntalScrollView,右下角顯示行標題的ScrollView以及右下角的包含列表的ScrollView 。這個ScrollView然後包含一個Horizo​​ntalScrollView,它又包含一個帶有多個顯示數據的子視圖的LinearLayout。我希望這清楚地解釋它,但這裏有一個圖,以使其更清晰:

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

我把它喜歡這樣,因爲我想要的指南列表,以水平和垂直滾動,但沒有做這個滾動視圖。另外,我希望無論指南列表在哪個位置都顯示行和列標題,但我希望它們能夠正確排列。所以我試圖找到一種方法來同步兩個hsv的位置,並且同步兩個sv的位置。我也試圖以避免每隔幾毫秒運行一個處理程序的方式來輪詢一個視圖並在另一個視圖上調用scrollTo。

我無法確定這是做到這一點的最佳方式,但這正是我所想到的。如果有人有任何其他建議,請隨時免費!

+0

@比利......你能找到解決方案嗎? – 2011-06-23 15:20:49

回答

1

在所有面板中執行onTouchEvent(MotionEvent me)不值得嗎?當你的一個面板被滾動時,這個方法會被調用,並且它可以確保所有其他面板保持同步。

1

處理觸摸事件不能100%正常工作。不同視圖中的滾動量可能始終不同步。

1

處理觸摸事件是不夠的,因爲如果你做了一個快速的幻燈片,釋放觸摸後滾動會持續一段時間。解決方案是重寫computeScroll()方法。看看https://github.com/chrisjenx/ParallaxScrollView它是如何在那裏完成的。

0

你可以看看這篇文章:Link

這傢伙究竟是幹什麼,他創建定製ScrollViews並重寫方法onScrollChanged,增加了一個監聽器,然後使它們同步他們被吸引到屏幕前。

你現在可以做的是在HorizontalScrollView中添加一個ScrollView作爲主框架。左欄將是HorizontalScrollView,頂部是ScrollView。然後,您將主要ScrollView和主要HorizontalScrollView註冊到兩個單獨的ScrollManagers(請參閱上面的鏈接)。

然後禁用hsv和sv的滾動並將它們添加到適當的ScrollManagers。那麼一切都應該正常工作。

-

PS。 如果您只使用監聽器本身,而不是ScrollManager,則可能會有1幀的同步延遲。

0

我通過做下面的事情已經實現了相同的佈局。

您會在xml中找到SyncedScrollView是用於同步兩個滾動視圖的自定義滾動視圖。

您需要在下面引用兩個stackoverflow答案。

  1. SynchedScrollView andig answer
  2. 優化SynchedScrollView my answer

檢查下面的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> 

每個單元的TextView這裏。所以你可以設置背景drawable來繪製盒子(它看起來像表格)

也可以動態添加左邊的標題,頂部標題和正文TextView來動態創建表格。

這是佈局 This is screen shot of layout

對不起,我的純英文的屏幕截圖。

相關問題