本發明涉及計算機技術領域,尤其涉及一種網格視圖控件的移動控制方法及系統。
背景技術:
在Android系統開發過程中,通過采用網格視圖(GridView)控件來顯示大量子視圖(View),網格視圖(GridView)是一個以網格(Grid)顯示子視圖(View),即二維、可滾動的網格,在Android系統開發過程中應用廣泛。在現有網格視圖(GridView)控件中,只能實現特定對稱方向的雙向滾動,無法實現任意方向滾動的目的。
技術實現要素:
本發明要解決的技術問題在于,針對現有網格視圖控件只能在特定對稱方向雙向滾動的問題,提供一種網格視圖控件的移動控制方法及系統。
本發明解決其技術問題所采用的技術方案是:一種網格視圖控件的移動控制方法,包括:
初始化配置網格容器的寬高和數據集;所述網格容器的寬高限定所述網格容器的屏幕顯示范圍,所述數據集包括N*M個呈二維數組結構排布的數據塊;
根據子視圖的寬高和所述網格容器的寬高,確定所述網格容器的屏幕顯示范圍中顯示的子視圖的數量和每一子視圖的位置;每一所述子視圖對應所述網格容器的屏幕顯示范圍內的數據塊;
接收用戶輸入的移動控制指令,根據所述移動控制指令獲取所述網格容器中的目標子視圖的位置;
根據所述目標子視圖的位置以及所述網格容器的屏幕顯示范圍的位置,控制所述網格容器相對于所述數據集移動或靜止,以使所述目標子視圖位于所述網格容器的屏幕顯示范圍中。
優選地,所述根據子視圖的寬高和所述網格容器的寬高,確定所述網格容器的屏幕顯示范圍中顯示的子視圖的數量和每一子視圖的位置,包括:
根據所述子視圖的寬高和所述網格容器的寬高分別確定所述網格容器的屏幕顯示范圍中橫向顯示和縱向顯示的子視圖的數量;
依據初始默認焦點所在的子視圖為起點子視圖;
從所述起點子視圖開始依據所述橫向顯示和縱向顯示的子視圖的數量依次填充,以確定所述網格容器的屏幕顯示范圍中顯示的每一所述子視圖的位置。
優選地,所述接收用戶輸入的移動控制指令,根據所述移動控制指令獲取所述網格容器中的目標子視圖,包括:
接收用戶輸入的滾動控制指令,所述滾動控制指令包括目標子視圖對應的數據塊在所述數據集中的坐標信息;將所述坐標信息對應的數據塊確定為所述網格容器中的目標子視圖;
或者,接收用戶通過點擊數據塊以輸入點擊控制指令;將所述點擊控制指令所點擊到的所述數據塊確定所述網格容器中的目標子視圖;
或者,接收用戶通過滑動手勢以輸入的滑動控制指令;所述滑動控制指令終點所擊中的數據塊確定為所述網格容器中的目標子視圖。
優選地,所述根據所述起點子視圖、目標子視圖以及所述網格容器的屏幕顯示范圍,控制所述網格容器相對于所述數據集移動,以使所述目標子視圖位于所述網格容器的屏幕顯示范圍中,包括:
判斷所述目標子視圖是否完全位于所述網格容器的屏幕顯示范圍內;
若目標子視圖完全位于網格容器的屏幕顯示范圍內,則控制所述網格容器相對于所述數據集靜止;
若目標子視圖不完全位于或者完全不位于網格容器的屏幕顯示范圍內,則計算使所述目標子視圖移動到網格容器的屏幕顯示范圍內的橫向移動和/或縱向移動的最小距離,根據所述橫向移動和/或縱向移動的最小距離控制所述網格容器移動,以使所述目標子視圖位于所述網格容器的屏幕顯示范圍內。
優選地,還包括:接收用戶輸入的屏幕拖動控制指令,控制所述網格視圖移動,并在移動過程中使接收所述屏幕拖動控制指令前焦點所在的子視圖位于所述網格視圖的屏幕顯示范圍內。
本發明還提供一種網格視圖控件的移動控制方法,包括:
初始配置單元,用于初始化配置網格容器的寬高和數據集;所述網格容器的寬高限定所述網格容器的屏幕顯示范圍,所述數據集包括N*M個呈二維數組結構排布的數據塊;
位置確定單元,用于根據子視圖的寬高和所述網格容器的寬高,確定所述網格容器的屏幕顯示范圍中顯示的子視圖的數量和每一子視圖的位置;每一所述子視圖對應所述網格容器的屏幕顯示范圍內的數據塊;
指令接收單元,用于接收用戶輸入的移動控制指令,根據所述移動控制指令獲取所述網格容器中的目標子視圖的位置;
移動控制單元,用于根據所述目標子視圖的位置以及所述網格容器的屏幕顯示范圍的位置,控制所述網格容器相對于所述數據集移動或靜止,以使所述目標子視圖位于所述網格容器的屏幕顯示范圍中。
優選地,所述位置確定單元包括:
視圖數量確定子單元,用于根據所述子視圖的寬高和所述網格容器的寬高分別確定所述網格容器的屏幕顯示范圍中橫向顯示和縱向顯示的子視圖的數量;
起點視圖確定子單元,用于依據初始默認焦點所在的子視圖為起點子視圖;
視圖填充確定子單元,用于從所述起點子視圖開始依據所述橫向顯示和縱向顯示的子視圖的數量依次填充,以確定所述網格容器的屏幕顯示范圍中顯示的每一所述子視圖的位置。
優選地,所述指令接收單元包括:
第一指令接收子單元,用于接收用戶輸入的滾動控制指令,所述滾動控制指令包括目標子視圖對應的數據塊在所述數據集中的坐標信息;將所述坐標信息對應的數據塊確定為所述網格容器中的目標子視圖;
第二指令接收子單元,用于接收用戶通過點擊數據塊以輸入點擊控制指令;將所述點擊控制指令所點擊到的所述數據塊確定所述網格容器中的目標子視圖;
第三指令接收子單元,用于接收用戶通過滑動手勢以輸入的滑動控制指令;所述滑動控制指令終點所擊中的數據塊確定為所述網格容器中的目標子視圖。
優選地,所述移動控制單元包括:
判斷子單元,用于判斷所述目標子視圖是否完全位于所述網格容器的屏幕顯示范圍內;
第一移動處理子單元,用于在所述目標子視圖完全位于所述網格容器的屏幕顯示范圍內時,控制所述網格容器相對于所述數據集靜止;
第二移動處理子單元,用于在所述目標子視圖不完全位于或者完全不位于所述網格容器的屏幕顯示范圍內時,計算使所述目標子視圖移動到網格容器的屏幕顯示范圍內的橫向移動和/或縱向移動的最小距離,根據所述橫向移動和/或縱向移動的最小距離控制所述網格容器移動,以使所述目標子視圖位于所述網格容器的屏幕顯示范圍內。
優選地,還包括拖動控制單元,用于接收用戶輸入的屏幕拖動控制指令,控制所述網格視圖移動,并在移動過程中使接收所述屏幕拖動控制指令前焦點所在的子視圖位于所述網格視圖的屏幕顯示范圍內。
本發明與現有技術相比具有如下優點:本發明所提供的網格視圖控件的移動控制方法中,可根據目標子視圖的位置和網格容器的屏幕顯示范圍位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍內。可以理解地,為使目標子視圖位于網格容器的屏幕顯示范圍內,需控制網格容器向任意方向移動,使該網格視圖控件可實現任意方向移動目的。
本發明所提供的網格視圖控件的移動控制系統中,移動控制單元可根據目標子視圖的位置和網格容器的屏幕顯示范圍的位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍內。可以理解地,為使目標子視圖位于網格容器的屏幕顯示范圍內,需控制網格容器向任意方向移動,使該網格視圖控件可實現任意方向移動的目的。
附圖說明
下面將結合附圖及實施例對本發明作進一步說明,附圖中:
圖1是本發明實施例1中網格視圖控件的移動控制方法的一流程圖。
圖2是本發明實施例1中網格視圖控件的移動控制方法的一局部流程圖。
圖3是本發明實施例1中數據集與網格容器的一示意圖。
圖4是本發明實施例1中數據集與網格容器的一示意圖。
圖5是本發明實施例1中數據集與網格容器的一示意圖。
圖6是本發明實施例1中數據集與網格容器的一示意圖。
圖7是本發明實施例1中數據集與網格容器的一示意圖。
圖8是本發明實施例2中網格視圖控件的移動控制系統的一原理框圖。
圖9是本發明實施例2中網格視圖控件的移動控制系統的另一原理框圖。
圖中:10、初始配置單元;20、位置確定單元;21、視圖數量確定子單元;22、起點視圖確定子單元;23、視圖填充確定子單元;30、指令接收單元;31、第一指令接收子單元;32、第二指令接收子單元;33、第三指令接收子單元;40、移動控制單元;41、判斷子單元;42、第一移動處理子單元;43、第二移動處理子單元;50、拖動控制單元。
具體實施方式
為了對本發明的技術特征、目的和效果有更加清楚的理解,現對照附圖詳細說明本發明的具體實施方式。
實施例1
圖1示出本實施例中的網格視圖控件的移動控制方法。如圖1所示,該網格視圖控件的移動控制方法包括:
S10:初始化配置網格容器的寬高和數據集;網格容器的寬高限定網格容器的屏幕顯示范圍;數據集包括N*M個呈二維數組結構排布的數據塊(Block)。如圖3-圖7所示,本實施例中的數據集(Adapter)放置有5*4個呈二維數組結構排布的數據塊,預設每一數據塊的寬度為單位寬度,每一數據塊的高度為單位高度。通過初始化配置網格容器(GridView)的寬高(即寬度和高度),可限定該網格容器(GridView)的屏幕顯示范圍,本實施例中的網格容器的寬高為3.5*2.5(如圖3-圖7中黑色實線框所示)。
S20:根據子視圖的寬高和網格容器的寬高,確定網格容器的屏幕顯示范圍中顯示的子視圖的數量和每一子視圖的位置;其中,每一子視圖對應網格容器的屏幕顯示范圍內的數據塊。本實施例中,子視圖的寬高分別對應數據塊(Block)的寬高,為單位寬度與單位高度。步驟S20具體包括:
S21:根據子視圖的寬高和網格容器的寬高分別確定網格容器的屏幕顯示范圍中橫向顯示和縱向顯示的子視圖的數量。由于子視圖對應于網格容器的屏幕顯示范圍內的數據塊,本實施例中,每一數據塊的寬度為單位寬度,每一數據塊的高度為單位高度,若預先配置的網格容器的寬高為3.5*2.5,則說明在該網格容器的屏幕顯示范圍內橫向顯示的子視圖為3.5個,縱向顯示的子視圖為2.5個。
S22:依據初始默認焦點所在的子視圖為起點子視圖。如圖3所示,由于在數據集(Adapter)所形成的二維數組結構中,每一數據塊(Block)相對于其他數據塊(Block)的位置已確定,在網格容器界面初始時,默認焦點為數據集(Adapter)中左上角的第一個數據塊1,將數據塊1設置為網格容器的屏幕顯示范圍中的起點子視圖。
S23:從起點子視圖開始依據橫向顯示和縱向顯示的子視圖的數量依次填充,以確定網格容器的屏幕顯示范圍中顯示的每一子視圖的位置。本實施例中,沒有完全落入網格容器的數據塊(如圖3中的子視圖11)和完全落入網格容器的數據塊均作為子視圖。相應地,完全沒有落入范圍網格容器的屏幕顯示范圍中的數據塊不作為子視圖,如數據塊5。
S30:接收用戶輸入的移動控制指令,根據移動控制指令獲取網格容器中的目標子視圖的位置。可以理解地,該移動控制指令可以是通過遙控器按鍵類型輸入的滾動控制指令,也可以是通過點擊網格容器所在屏幕中的數據塊所輸入的點擊控制指令,還可以是通過滑動手勢以輸入的滑動控制指令(即執行touch事件)。
步驟S30可以具體包括:接收用戶輸入的滾動控制指令,滾動控制指令包括目標子視圖對應的數據塊在數據集中的坐標信息;將坐標信息對應的數據塊確定為網格容器中的目標子視圖。可以理解地,滾動控制指令中的坐標信息包括X軸坐標和Y軸坐標,在本實施例中,若滾動控制指令輸入的坐標信息為(3,3),則其目標子視圖對應的數據塊為數據塊13,則數據塊13為網格容器中的目標子視圖。
步驟S30可以具體包括:接收用戶通過點擊網格容器所在屏幕中的數據塊所輸入的點擊控制指令,當接收用戶通過點擊數據塊以輸入點擊控制指令;將點擊控制指令所點擊到的數據塊確定網格容器中的目標子視圖。如圖5所示,用戶可點擊網格容器的屏幕顯示范圍中的子視圖14,將子視圖14確定為網格容器的目標子視圖。
步驟S30可以具體包括:接收用戶通過滑動手勢以輸入的滑動控制指令;滑動控制指令終點所擊中的數據塊確定為網格容器中的目標子視圖。如圖5所示,用戶可將手指在網格容器所在屏幕上滑動以輸入滑動控制指令,若用戶的滑動手勢是從子視圖1移動到子視圖13,則該滑動控制指令終點所擊中的子視圖13即為網格容器的目標子視圖。
S40:根據目標子視圖的位置和網格容器的屏幕顯示范圍的位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍中。可以理解地,由于用戶輸入的移動控制指令所確定的目標子視圖可能完全位于網格容器的屏幕顯示范圍內,也可能完全不位于或不完全位于在網格容器的屏幕顯示范圍之內,步驟S40具體包括:
S41:判斷目標子視圖是否完全位于網格容器的屏幕顯示范圍內。本實施例中,以數據集所在屏幕的位置建立二維坐標系,以左上角為坐標原點;由于數據集中的每一數據塊的位置已確定,即目標子視圖的位置已確定,若設目標子視圖的位置中橫向坐標范圍為(x1,x2),縱向坐標范圍為(y1,y2);相應地,其網格容器的屏幕顯示范圍的位置中橫向坐標范圍(X1,X2),縱向坐標范圍為(Y1,Y2)。若X1≦x1≦x2≦X2且Y1≦y1≦y2≦Y2;則目標子視圖完全位于網格容器的屏幕顯示范圍內。若x2≦X1或者X2≦x1或者y2≦Y1或者Y2≦y1,則目標子視圖完全不位于網格容器的屏幕顯示范圍內。其中,x2≦X1表示目標子視圖位于網格容器的屏幕顯示范圍的左側;X2≦x1表示目標子視圖位于網格容器的屏幕顯示范圍的右側;y2≦Y1表示目標子視圖位于網格容器的屏幕顯示范圍的下側;若Y2≦y1表示目標子視圖位于網格容器的屏幕顯示范圍的上側。若不滿足完全位于或完全不位于網格容器的屏幕顯示范圍內的條件,則目標子視圖不完全位于網格容器的屏幕顯示范圍內。
S42:若目標子視圖完全位于網格容器的屏幕顯示范圍內,則控制網格容器相對于數據集靜止。可以理解地,若X1≦x1≦x2≦X2,且Y1≦y1≦y2≦Y2,則目標子視圖完全位于網格容器的屏幕顯示范圍內,則控制網格容器相對于數據集靜止。
S43:若目標子視圖不完全位于或者完全不位于網格容器的屏幕顯示范圍內,則計算使目標子視圖移動到網格容器的屏幕顯示范圍內的橫向移動和/或縱向移動的最小距離,根據橫向移動和/或縱向移動的最小距離控制網格容器移動,以使目標子視圖位于網格容器的屏幕顯示范圍內。本實施例中,若x2≦X1,則目標子視圖位于網格容器的屏幕顯示范圍的左側,其需橫向移動的最小距離為X1-x1;若X2≦x1,則目標子視圖位于網格容器的屏幕顯示范圍的右側,其需橫向移動的最小距離為x2-X2;若x1≦X1≦x2≦X2,則目標子視圖局部位于網格容器的屏幕顯示范圍的左側,其需橫向移動的最小距離為X1-x1;若X1≦x1≦X2≦x2,則目標子視圖局部位于網格容器的屏幕顯示范圍的右側,其需橫向移動的最小距離為x2-X2。相應地,若y2≦Y1,則目標子視圖位于網格容器的屏幕顯示范圍的下側,其需縱向移動的最小距離為Y1-y1;若Y2≦y1,則目標子視圖位于網格容器的屏幕顯示范圍的上側,其需縱向移動的最小距離為y2-X2;若y1≦Y1≦y2≦Y2,則目標子視圖局部位于網格容器的屏幕顯示范圍的下側,其需縱向移動的最小距離為Y1-y1;若Y1≦y1≦Y2≦y2,則目標子視圖局部位于網格容器的屏幕顯示范圍的上側,其需縱向移動的最小距離為y2-X2。
圖3示出初始化配置的數據集及對應的網格容器的屏幕顯示范圍的示意圖。在圖3中,任意點擊子視圖2、子視圖3、子視圖6、子視圖7和子視圖8,由于上述子視圖位于網格容器的屏幕顯示范圍內,只需將焦點所在的子視圖移動到點擊到的子視圖上,該網格視圖控件不會滾動。在圖3的基礎上,點擊子視圖13對應的數據塊,焦點跳轉到子視圖13,由于子視圖13的下側局部超出網格容器的屏幕顯示范圍,計算縱向移動的最小距離;控制網格視圖控件向下滾動,以使子視圖13位于網格容器的屏幕顯示范圍內,如圖4所示。若在圖4的基礎上,再點擊子視圖14使焦點跳轉到子視圖14,由于子視圖14的右側局部超出網格容器的屏幕顯示范圍,計算橫向移動的最小距離,控制網格視圖控件向右滾動,以使子視圖14位于網格容器的屏幕顯示范圍內,如圖5所示。若在圖5的基礎上點擊數據集右下角的數據塊20,由于數據塊20完全在網格容器的屏幕顯示范圍之外,則需分別計算其橫向移動的最小距離和縱向移動的最小距離,控制網格視圖控件向下并向右滾動,使其最終效果如圖7所示。
S50:接收用戶輸入的屏幕拖動控制指令,控制網格視圖移動,并在移動過程中使接收屏幕拖動控制指令前焦點所在的子視圖位于網格視圖的屏幕顯示范圍內。當焦點在子視圖14上時,接收用戶輸入的屏幕拖動控制指令,向左上角方向拖動屏幕,則屏幕顯示范圍中顯示的子視圖的位置會發生變化,在屏幕拖動過程中,使其焦點所在的子視圖14不超出網格視圖的屏幕顯示范圍,拖動后如圖6所示。
可以理解地,對于每個需要顯示大量數據的網格容器(ViewGroup)來說,內存控制尤為重要,本實施例中采用AbsListView的實現方式。AbsListView的核心一是數據集(Adapter)和子視圖(view)的分離,二是RecycleBin機制。第一點是AbsListView及其子類的最終展示的數據集都是通過adapter管理,而adapter會返回網格容器(ViewGroup)的每個子視圖(view),這樣可以降低代碼耦合性;第二點是子視圖(view)的緩存和重復利用。用戶對于網格容器(ViewGroup)的移動操作,會導致子視圖(view)的位置變化,有新的子視圖(view)進入顯示范圍同樣也有舊的子視圖(view)移出顯示范圍,RecycleBin的機制主要是維護一個當前屏幕顯示范圍內的view數組,并實時將移出去的子視圖(view)從父節點中detach,然后放到該類下的另一個數組中緩存,當有新的子視圖(view)進入屏幕顯示范圍內時,優先從緩存中取子視圖(view),否則重新inflate一個子視圖(view),最終填充數據后attach到網格容器(ViewGroup)顯示。當需要實現上下左右滾動且內存穩定時,我們就需要在各個方向上處理子視圖(view)的移出和移入,由于各個方向數量的不確定性,該網格容器(ViewGroup)的RecycleBin機制會比GridView復雜一個維度。
本實施例所提供的網格視圖控件的移動控制方法中,可根據目標子視圖的位置和網格容器的屏幕顯示范圍的位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍內;可以理解地,為使目標子視圖位于網格容器的屏幕顯示范圍內,需控制網格容器向任意方向移動,使該網格視圖控件可實現任意方向移動目的。
實施例2
圖8和圖9示出本實施例中的網格視圖控件的移動控制系統。如圖1所示,該網格視圖控件的移動控制系統包括:
初始配置單元10,用于初始化配置網格容器的寬高和數據集;網格容器的寬高限定網格容器的屏幕顯示范圍;數據集包括N*M個呈二維數組結構排布的數據塊(Block)。如圖3-圖7所示,本實施例中的數據集(Adapter)放置有5*4個呈二維數組結構排布的數據塊,預設每一數據塊的寬度為單位寬度,每一數據塊的高度為單位高度。通過初始化配置網格容器(GridView)的寬高(即寬度和高度),可限定該網格容器(GridView)的屏幕顯示范圍,本實施例中的網格容器的寬高為3.5*2.5(如圖3-圖7中黑色實線框所示)。
位置確定單元20,用于根據子視圖的寬高和網格容器的寬高,確定網格容器的屏幕顯示范圍中顯示的子視圖的數量和每一子視圖的位置;其中,每一子視圖對應網格容器的屏幕顯示范圍內的數據塊。本實施例中,子視圖的寬高分別對應數據塊(Block)的寬高,為單位寬度與單位高度。位置確定單元20具體包括:
視圖數量確定子單元21,用于根據子視圖的寬高和網格容器的寬高分別確定網格容器的屏幕顯示范圍中橫向顯示和縱向顯示的子視圖的數量。由于子視圖對應于網格容器的屏幕顯示范圍內的數據塊,本實施例中,每一數據塊的寬度為單位寬度,每一數據塊的高度為單位高度,若預先配置的網格容器的寬高為3.5*2.5,則說明在該網格容器的屏幕顯示范圍內橫向顯示的子視圖為3.5個,縱向顯示的子視圖為2.5個。
起點視圖確定子單元22,用于依據初始默認焦點所在的子視圖為起點子視圖。如圖3所示,由于在數據集(Adapter)所形成的二維數組結構中,每一數據塊(Block)相對于其他數據塊(Block)的位置已確定,在網格容器界面初始時,默認焦點為數據集(Adapter)中左上角的第一個數據塊1,將數據塊1設置為網格容器的屏幕顯示范圍中的起點子視圖。
視圖填充確定子單元23,用于從起點子視圖開始依據橫向顯示和縱向顯示的子視圖的數量依次填充,以確定網格容器的屏幕顯示范圍中顯示的每一子視圖的位置。可以理解地,本實施例中,沒有完全落入網格容器的數據塊(如圖3中的子視圖11)和完全落入網格容器的數據塊均作為子視圖(如圖3中的子視圖6)。相應地,完全沒有落入范圍網格容器的屏幕顯示范圍中的數據塊不作為子視圖顯示,如數據塊5。
指令接收單元30,用于接收用戶輸入的移動控制指令,根據移動控制指令獲取網格容器中的目標子視圖的位置。可以理解地,該移動控制指令可以是通過遙控器按鍵類型輸入的滾動控制指令,也可以是通過點擊網格容器所在屏幕中的數據塊所輸入的點擊控制指令,還可以是通過滑動手勢以輸入的滑動控制指令(即執行touch事件)。
指令接收單元30可以包括第一指令接收子單元31,用于接收用戶輸入的滾動控制指令,滾動控制指令包括目標子視圖對應的數據塊在數據集中的坐標信息;將坐標信息對應的數據塊確定為網格容器中的目標子視圖。可以理解地,滾動控制指令中的坐標信息包括X軸坐標和Y軸坐標,在本實施例中,若滾動控制指令輸入的坐標信息為(3,3),則其目標子視圖對應的數據塊為數據塊13,則數據塊13為網格容器中的目標子視圖。
指令接收單元30可以包括第二指令接收子單元32,用于接收用戶通過點擊網格容器所在屏幕中的數據塊所輸入的點擊控制指令,當接收用戶通過點擊數據塊以輸入點擊控制指令;將點擊控制指令所點擊到的數據塊確定網格容器中的目標子視圖。如圖5所示,用戶可點擊網格容器的屏幕顯示范圍中的子視圖14,將子視圖14確定為網格容器的目標子視圖。
指令接收單元30可以包括第三指令接收子單元33,用于接收用戶通過滑動手勢以輸入的滑動控制指令;滑動控制指令終點所擊中的數據塊確定為網格容器中的目標子視圖。如圖5所示,用戶可將手指在網格容器所在屏幕上滑動以輸入滑動控制指令,若用戶的滑動手勢是從子視圖1移動到子視圖13,則該滑動控制指令終點所擊中的子視圖13即為網格容器的目標子視圖。
移動控制單元40,用于根據目標子視圖的位置和網格容器的屏幕顯示范圍的位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍中。可以理解地,由于用戶輸入的移動控制指令所確定的目標子視圖可能完全位于網格容器的屏幕顯示范圍內,也可能完全不位于或不完全位于網格容器的屏幕顯示范圍之內。移動控制單元40具體包括判斷子單元41、第一移動處理子單元42和第二移動處理子單元43。
判斷子單元41,用于判斷目標子視圖是否完全位于網格容器的屏幕顯示范圍內。本實施例中,以數據集所在屏幕的位置建立二維坐標系,以左上角為坐標原點;由于數據集中的每一數據塊的位置已確定,即目標子視圖的位置已確定,若設目標子視圖的位置中橫向坐標范圍為(x1,x2),縱向坐標范圍為(y1,y2);相應地,其網格容器的屏幕顯示范圍的位置中橫向坐標范圍(X1,X2),縱向坐標范圍為(Y1,Y2)。若X1≦x1≦x2≦X2且Y1≦y1≦y2≦Y2;則目標子視圖完全位于網格容器的屏幕顯示范圍內。若x2≦X1或者X2≦x1或者y2≦Y1或者Y2≦y1,則目標子視圖完全不位于網格容器的屏幕顯示范圍內。其中,x2≦X1表示目標子視圖位于網格容器的屏幕顯示范圍的左側;X2≦x1表示目標子視圖位于網格容器的屏幕顯示范圍的右側;y2≦Y1表示目標子視圖位于網格容器的屏幕顯示范圍的下側;若Y2≦y1表示目標子視圖位于網格容器的屏幕顯示范圍的上側。若不滿足完全位于或完全不位于網格容器的屏幕顯示范圍內的條件,則目標子視圖不完全位于網格容器的屏幕顯示范圍內。。
第一移動處理子單元42,用于在目標子視圖完全位于網格容器的屏幕顯示范圍內時,控制網格容器相對于數據集靜止。可以理解地,若X1≦x1≦x2≦X2,且Y1≦y1≦y2≦Y2,則目標子視圖完全位于網格容器的屏幕顯示范圍內,則控制網格容器相對于數據集靜止。
第二移動處理子單元43,用于在目標子視圖不完全位于或者完全不位于網格容器的屏幕顯示范圍內時,計算使目標子視圖移動到網格容器的屏幕顯示范圍內的橫向移動和/或縱向移動的最小距離,根據橫向移動和/或縱向移動的最小距離控制網格容器移動,以使目標子視圖位于網格容器的屏幕顯示范圍內。本實施例中,若x2≦X1,則目標子視圖位于網格容器的屏幕顯示范圍的左側,其需橫向移動的最小距離為X1-x1;若X2≦x1,則目標子視圖位于網格容器的屏幕顯示范圍的右側,其需橫向移動的最小距離為x2-X2;若x1≦X1≦x2≦X2,則目標子視圖局部位于網格容器的屏幕顯示范圍的左側,其需橫向移動的最小距離為X1-x1;若X1≦x1≦X2≦x2,則目標子視圖局部位于網格容器的屏幕顯示范圍的右側,其需橫向移動的最小距離為x2-X2。相應地,若y2≦Y1,則目標子視圖位于網格容器的屏幕顯示范圍的下側,其需縱向移動的最小距離為Y1-y1;若Y2≦y1,則目標子視圖位于網格容器的屏幕顯示范圍的上側,其需縱向移動的最小距離為y2-X2;若y1≦Y1≦y2≦Y2,則目標子視圖局部位于網格容器的屏幕顯示范圍的下側,其需縱向移動的最小距離為Y1-y1;若Y1≦y1≦Y2≦y2,則目標子視圖局部位于網格容器的屏幕顯示范圍的上側,其需縱向移動的最小距離為y2-X2。
圖3示出初始化配置的數據集及對應的網格容器的屏幕顯示范圍的示意圖。在圖3中,任意點擊子視圖2、子視圖3、子視圖6、子視圖7和子視圖8,由于上述子視圖位于網格容器的屏幕顯示范圍內,只需將焦點所在的子視圖移動到點擊到的子視圖上,該網格視圖控件不會滾動。在圖3的基礎上,點擊子視圖13對應的數據塊,焦點跳轉到子視圖13,由于子視圖13的下側局部超出網格容器的屏幕顯示范圍,計算縱向移動的最小距離;控制網格視圖控件向下滾動,以使子視圖13位于網格容器的屏幕顯示范圍內,如圖4所示。若在圖4的基礎上,再點擊子視圖14使焦點跳轉到子視圖14,由于子視圖14的右側局部超出網格容器的屏幕顯示范圍,計算橫向移動的最小距離,控制網格視圖控件向右滾動,以使子視圖14位于網格容器的屏幕顯示范圍內,如圖5所示。若在圖5的基礎上點擊數據集右下角的數據塊20,由于數據塊20完全在網格容器的屏幕顯示范圍之外,則需分別計算其橫向移動的最小距離和縱向移動的最小距離,控制網格視圖控件向下并向右滾動,使其最終效果如圖7所示。
拖動控制單元50,用于接收用戶輸入的屏幕拖動控制指令,控制網格視圖移動,并在移動過程中使接收屏幕拖動控制指令前焦點所在的子視圖位于網格視圖的屏幕顯示范圍內。當焦點在子視圖14上時,接收用戶輸入的屏幕拖動控制指令,向左上角方向拖動屏幕,則屏幕顯示范圍中顯示的子視圖的位置會發生變化,在屏幕拖動過程中,使其焦點所在的子視圖14不超出網格視圖的屏幕顯示范圍,拖動后如圖6所示。
可以理解地,對于每個需要顯示大量數據的網格容器(ViewGroup)來說,內存控制尤為重要,本實施例中采用AbsListView的實現方式。AbsListView的核心一是數據集(Adapter)和子視圖(view)的分離,二是RecycleBin機制。第一點是AbsListView及其子類的最終展示的數據集都是通過adapter管理,而adapter會返回網格容器(ViewGroup)的每個子視圖(view),這樣可以降低代碼耦合性;第二點是子視圖(view)的緩存和重復利用。用戶對于網格容器(ViewGroup)的移動操作,會導致子視圖(view)的位置變化,有新的子視圖(view)進入顯示范圍同樣也有舊的子視圖(view)移出顯示范圍,RecycleBin的機制主要是維護一個當前屏幕顯示范圍內的view數組,并實時將移出去的子視圖(view)從父節點中detach,然后放到該類下的另一個數組中緩存,當有新的子視圖(view)進入屏幕顯示范圍內時,優先從緩存中取子視圖(view),否則重新inflate一個子視圖(view),最終填充數據后attach到網格容器(ViewGroup)顯示。當需要實現上下左右滾動且內存穩定時,我們就需要在各個方向上處理子視圖(view)的移出和移入,由于各個方向數量的不確定性,該網格容器(ViewGroup)的RecycleBin機制會比GridView復雜一個維度。
本實施例所提供的網格視圖控件的移動控制系統中,移動控制單元40可根據目標子視圖的位置和網格容器的屏幕顯示范圍的位置,控制網格容器相對于數據集移動或靜止,以使目標子視圖位于網格容器的屏幕顯示范圍內;可以理解地,為使目標子視圖位于網格容器的屏幕顯示范圍內,需控制網格容器向任意方向移動,使該網格視圖控件可實現任意方向移動目的。
本發明是通過幾個具體實施例進行說明的,本領域技術人員應當明白,在不脫離本發明范圍的情況下,還可以對本發明進行各種變換和等同替代。另外,針對特定情形或具體情況,可以對本發明做各種修改,而不脫離本發明的范圍。因此,本發明不局限于所公開的具體實施例,而應當包括落入本發明權利要求范圍內的全部實施方式。