本發(fā)明涉及計算機技術領域,特別是涉及一種基于滾動控件實現內容物滾動的方法和裝置。
背景技術:
“控件”,是gui(graphicaluserinterface,圖形用戶接口)界面的組成元素,每一個控件都有自己的功能和展現形式。滾動容器控件是一個帶有滾動功能的容器控件,滾動容器控件通常帶有一個“滾動條”。在手機屏幕上呈現的滾動容器控件,通常會根據手指的行為,連續(xù)地移動其中的內容物,例如:拖動時內容物跟著手移動,用力往上滑動放手后內容物像被拋出一樣繼續(xù)往前移動一段距離后停下來。傳統(tǒng)的滾動控件中的內容物常常出現滾動不流暢的情況,在用戶手放開后,滾動方向有時會不跟手指運動方向對應,有時還會向相反的方向運動。
技術實現要素:
基于此,有必要針對滾動控件中的內容物滾動不與手指運動方向對應的問題,提供一種基于滾動控件實現內容物滾動的方法,能使內容物滾動的方向與手指離開方向保持一致。
此外,還有必要針對滾動控件中的內容物滾動不與手指運動方向對應的問題,提供一種基于滾動控件實現內容物滾動的裝置,能使內容物滾動的方向與手指離開方向保持一致。
一種基于滾動控件實現內容物滾動的方法,包括以下步驟:
接收接觸事件,停止?jié)L動滾動控件中的內容物并記錄當前的內容物頂部坐標;
接收移動事件,獲取移動事件中對應的觸控坐標,并根據所述觸控坐標計算并更新所述內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動;
接收抬起事件,并根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行慣性滾動;
若是,則確定觸控離開速度,根據所述觸控離開速度計算慣性滾動位移量,并根據所述最后一次移動事件中計算得到的內容物頂部坐標及所述慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動;
若否,則根據所述最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行回滾,若執(zhí)行回滾,則獲取回滾時刻,并根據所述最后一次移動事件中計算得到的內容物頂部坐標及所述回滾時刻計算并更新回滾過程中的內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動。
一種基于滾動控件實現內容物滾動的裝置,包括:
接觸模塊,用于接收接觸事件,停止?jié)L動滾動控件中的內容物并記錄當前的內容物頂部坐標;
移動模塊,用于接收移動事件,獲取移動事件中對應的觸控坐標,并根據所述觸控坐標計算并更新所述內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動;
抬起模塊,用于接收抬起事件,并根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行慣性滾動;
慣性滾動模塊,用于若執(zhí)行慣性滾動,則確定觸控離開速度,根據所述觸控離開速度計算慣性滾動位移量,并根據所述最后一次移動事件中計算得到的內容物頂部坐標及所述慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動;
回滾模塊,用于根據所述最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行回滾,若執(zhí)行回滾,則獲取回滾時刻,并根據所述最后一次移動事件中計算得到的內容物頂部坐標及所述回滾時刻計算并更新回滾過程中的內容物頂部坐標,以使所述內容物隨著所述內容物頂部坐標滾動。
上述基于滾動控件實現內容物滾動的方法和裝置,根據不同的事件以不同的方式計算內容物頂部坐標,使得在移動事件中的滾動、慣性滾動及回滾過程中,滾動控件中的內容物隨著內容物頂部坐標的變化不斷進行滾動;并且,在慣性滾動中,根據觸控離開速度計算慣性滾動位移量,并計算慣性滾動過程中的內容物頂部坐標,能夠根據接觸物運動軌跡進行計算,使內容物滾動的方向與接觸物離開方向保持一致,不會出現滾動方向與手指運動方向相反的情況,使?jié)L動更流暢。
附圖說明
圖1為一個實施例中基于滾動控件實現內容物滾動的方法的流程示意圖;
圖2為一個實施例中滾動控件的示意圖;
圖3為一個實施例中計算移動事件中內容物頂部坐標的流程示意圖;
圖4(a)為一個實施例中內容物拉扯上邊緣的示意圖;
圖4(b)為一個實施例中內容物拉扯下邊緣的示意圖;
圖5為一個實施例中計算慣性滾動過程中的內容物頂部坐標的流程示意圖;
圖6為一個實施例中計算回滾過程中的內容物頂部坐標的流程示意圖;
圖7為一個實施例中基于滾動控件實現內容物滾動的裝置的結構示意圖;
圖8為另一個實施例中基于滾動控件實現內容物滾動的裝置的結構示意圖;
圖9為一個實施例中移動模塊的內部結構示意圖;
圖10為一個實施例中慣性滾動模塊的內部結構示意圖;
圖11為一個實施例中慣性滾動模塊中的處理單元的內部結構示意圖;
圖12為一個實施例中回滾模塊的內部結構示意圖。
具體實施方式
為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,一種基于滾動控件實現內容物滾動的方法,包括以下步驟:
步驟s110,接收接觸事件,停止?jié)L動滾動控件中的內容物并記錄當前的內容物頂部坐標。
具體的,接觸事件可包括手指或鼠標等接觸物點擊產生的點擊事件、手指或手寫筆等接觸物觸摸按下時產生的按下事件等。當接收到接觸事件,即立即停止?jié)L動滾動控件中的內容物,并記錄當前的內容物頂部坐標及當前的觸控坐標,其中,觸控坐標指的是接觸物所在的坐標。在本實施例中,觸控坐標可僅考慮接觸物在滾動控件豎直方向上的坐標。
在一個實施例中,在步驟接收接觸事件,停止?jié)L動滾動控件中的內容物并記錄當前的內容物頂部坐標之前,還包括:預先建立滾動控件。
具體的,如圖2所示,圖2為一個實施例中滾動控件的示意圖。滾動控件包括背景區(qū)域10和內容物區(qū)域20,內容物區(qū)域20疊加在背景區(qū)域10上,背景區(qū)域10和內容物區(qū)域20均為矩形,內容物區(qū)域20可在背景區(qū)域10上面上下移動。其中,x代表內容物頂部坐標,x*代表內容物底部坐標,h1為背景區(qū)域10的長度,h2為內容物區(qū)域20的長度,并令背景區(qū)域10的上邊緣所在線的坐標為坐標起始點0。內容物區(qū)域20的長度h2大于背景區(qū)域10的長度h1,內容物底部坐標x*=x+h2,當滾動控件的內容物按照一定方向進行滾動時,內容物頂部坐標的x值會不斷進行變化。
步驟s120,接收移動事件,獲取移動事件中對應的觸控坐標,并根據觸控坐標計算并更新內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
具體的,當手指、鼠標或手寫筆等接觸物在屏幕上進行移動時,將觸發(fā)一連串的移動事件,并形成移動軌跡。接收接觸物在屏幕上進行移動時產生的多個移動事件,并獲取每個移動事件中對應的觸控坐標及移動時刻,其中,移動時刻指的是移動事件發(fā)生時操作系統(tǒng)給出的移動事件發(fā)生時間。根據當前移動事件中獲取的觸控坐標及在接觸事件中記錄的觸控坐標計算出觸控位移量,并根據該觸控位移量計算新的內容物頂部坐標,以使?jié)L動控件中的內容物隨著新的內容物頂部坐標進行滾動。
如圖3所示,在一個實施例中,步驟s120接收移動事件,獲取移動事件中對應的觸控坐標,并根據觸控坐標計算并更新內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動,包括以下步驟:
步驟s302,獲取當前的內容物頂部坐標與接觸事件中對應的觸控坐標。
具體的,令獲取的當前的內容物頂部坐標為x0,接觸事件中對應的觸控坐標為p0。
步驟s304,接收移動事件,并獲取移動時刻的新的觸控坐標。
具體的,獲取當前的移動事件中的移動時刻對應的新的觸控坐標,并令新的觸控坐標為p。
步驟s306,根據新的觸控坐標及接觸事件中對應的觸控坐標確定觸控位移量。
具體的,觸控位移量為當前移動事件中對應的觸控坐標與接觸事件中對應的觸控坐標的偏移量,令觸控位移量為δfinger,則δfinger=p-p0。
步驟s308,根據當前的內容物頂部坐標判斷內容物在當前狀態(tài)下是否拉扯邊緣,若是,則執(zhí)行步驟s310,若否,則執(zhí)行步驟s318。
具體的,內容物拉扯邊緣包括內容物拉扯上邊緣及內容物拉扯下邊緣。如圖4(a)所示,圖4(a)為一個實施例中內容物拉扯上邊緣的示意圖,內容物頂部坐標x大于0,即表示內容物拉扯上邊緣。如圖4(b)所示,圖4(b)為一個實施例中內容物拉扯下邊緣的示意圖,當內容物底部坐標x*小于h1,即表示內容物拉扯下邊緣,即當x+h2小于h1時,內容物拉扯下邊緣。如圖2所示,當內容物頂部坐標x小于或等于0且內容物底部坐標x*大于或等于h1,即表示內容物不拉扯邊緣。判斷內容物是否拉扯邊緣的函數可如下所示:
令x=x0,代入上述函數計算,當s(x)>0時,則內容物拉扯上邊緣,當s(x)=0時,則內容物不拉扯邊緣,當s(x)<0時,則內容物拉扯下邊緣。
步驟s310,根據當前的內容物頂部坐標計算假定拉扯距離。
具體的,可預先設定計算邊緣的拉伸距離的函數如下所示:
其中,δ代表接觸物的拉扯距離,拉扯距離即表示從開始拉扯邊緣后接觸物移動的距離,例如,從開始拉扯上邊緣接觸物向下移動的距離,h1為滾動控件中的背景區(qū)域的長度,邊緣的拉伸距離即為接觸物拉扯后內容物與邊緣之間的距離。若存在內容物拉扯邊緣的情況,則可利用上述計算邊緣的拉伸距離的函數計算得到當前內容物距離邊緣的距離。當內容物在當前狀態(tài)下拉扯邊緣時,可先根據當前的內容物頂部坐標計算接觸物的假定拉扯距離。在當前的移動事件中,內容物處于拉扯邊緣狀態(tài),可假設該拉扯邊緣狀態(tài)是由于接觸物從上往下或從下往上拉伸導致的,則需要得到其拉伸到當前程度的拉扯距離,即接觸物的假定拉扯距離,假定拉扯距離表示在當前移動事件中,接觸物假設已拉扯的距離。假定拉扯距離為計算拉伸距離的函數的反函數,公示如下所示:
若內容物拉扯上邊緣,則假定拉扯距離為
步驟s312,根據假定拉扯距離及觸控位移量判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,則執(zhí)行步驟s314,若否,則執(zhí)行步驟s316。
具體的,假定狀態(tài)指的是假定內容物根據計算得到的新的內容物頂部坐標進行滾動后的狀態(tài)。根據假定拉扯距離及觸控位移量判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,即表示內容物根據當前的移動事件計算得到新的內容物頂部坐標進行滾動后依然處于拉扯邊緣的狀態(tài),若否,即表示內容物根據當前的移動事件計算得到新的內容物頂部坐標進行滾動后不拉扯邊緣。
若當前內容物拉扯上邊緣,則當假定拉扯距離與觸控位移量之和大于或等于0時,即
步驟s314,根據假定拉扯距離與觸控位移量計算拉伸距離,并根據拉伸距離計算新的內容物頂部坐標。
具體的,當內容物拉扯上邊緣時,且新的內容物頂部坐標使得內容物依然處于拉扯上邊緣狀態(tài),即當s(x0)>0,且
當內容物拉扯下邊緣時,且新的內容物頂部坐標使得內容物依然處于拉扯下邊緣狀態(tài),即當s(x0)<0,且
步驟s316,根據假定拉扯距離與觸控位移量計算新的內容物頂部坐標。
具體的,若根據假定拉扯距離及觸控位移量判斷出內容物不拉扯邊緣,則新的內容物坐標即可根據假定拉扯距離與觸控位移量抵消后的值進行計算。當內容物拉扯上邊緣時,若新的內容物頂部坐標使得內容物不再處于拉扯上邊緣狀態(tài),即當s(x0)>0,且
當內容物拉扯下邊緣時,若新的內容物頂部坐標使得內容物不再處于拉扯下邊緣狀態(tài),即當s(x0)<0,且
步驟s318,根據當前的內容物頂部坐標與觸控位移量之和判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,則執(zhí)行步驟s320,若否,則執(zhí)行步驟s322。
具體的,若當前的內容物不拉扯邊緣,即s(x0)=0,則根據當前的內容物頂部坐標與觸控位移量之和判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,則表示內容物根據當前的移動事件計算得到新的內容物頂部坐標進行滾動后將處于拉扯邊緣的狀態(tài),若否,則表示內容物根據當前的移動事件計算得到新的內容物頂部坐標進行滾動后依然不拉扯邊緣。若s(x0+δfinger)>0或s(x0+δfinger)<0,則新的內容物頂部坐標使內容物處于拉扯邊緣狀態(tài),若s(x0+δfinger)=0,則新的內容物頂部坐標使內容物不拉扯邊緣。
步驟s320,根據當前的內容物頂部坐標與觸控位移量計算拉伸距離,并根據拉伸距離計算新的內容物頂部坐標。
具體的,若新的內容物頂部坐標使內容物拉扯上邊緣,即當s(x0)=0且s(x0+δfinger)>0,可先計算拉伸距離fstretch(x0+p-p0),則新的內容物頂部坐標x1=fstretch(x0+p-p0)。若新的內容物頂部坐標使內容物拉扯下邊緣,即當s(x0)=0且s(x0+δfinger)<0,則可先計算拉伸距離fstretch(h1-(x0+p-p0)-h2),則新的內容物頂部坐標x1=h1-fstretch(h1-(x0+p-p0)-h2)-h2。
步驟s322,根據當前的內容物頂部坐標與觸控位移量計算新的內容物頂部坐標。
具體的,若新的內容物頂部坐標使內容物不拉扯邊緣,即當s(x0)=0且s(x0+δfinger)=0,則新的內容物頂部坐標x1=x0+p-p0。
在移動事件中,新的內容物頂部坐標x1的各種不同情況的計算方式可如表1具體所示:
表1
步驟s130,接收抬起事件,并根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行慣性滾動,若是,則執(zhí)行步驟s140,若否,則執(zhí)行步驟s150。
具體的,抬起事件為接觸物離開屏幕所產生的事件,當接收到抬起事件時,可根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行慣性滾動,令xend為最后一次移動事件中計算得到的內容物頂部坐標,若內容物不拉扯邊緣,即當s(xend)=0,則執(zhí)行慣性滾動,若內容物拉扯邊緣,即當s(xend)>0或s(xend)<0,則不執(zhí)行慣性滾動。
步驟s140,確定觸控離開速度,根據觸控離開速度計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
具體的,當接觸物離開屏幕時,內容物會隨著接觸物的離開方向及觸控離開速度繼續(xù)滾動一段時間再停下來,這個過程即為慣性滾動。
如圖5所示,在一個實施例中,步驟s140確定觸控離開速度,根據觸控離開速度計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動,具體包括以下步驟:
步驟s502,分別獲取最后一次移動事件的觸控坐標及前一次移動事件的觸控坐標。
具體的,可獲取最后一次移動事件的觸控坐標pend及前一次移動事件的觸控坐標pprev,其中,pprev可為與最后一次移動事件相連的前一次移動事件中的觸控坐標,也可為前幾次移動事件中的觸控坐標,pend需是與pprev有明顯區(qū)別的兩個點。
步驟s504,獲取最后一次移動事件的移動時刻與前一次移動事件的移動時刻的時間間隔。
具體的,獲取了pend與pprev之后,需進一步獲取與該兩個觸控坐標對應的移動時刻tend(毫秒)及tprev,并計算二者的時間間隔tδ=tend-tprev,在實際運算中,為確保pend與pprev是明顯區(qū)別的兩個點,可令tδ>16(毫秒),即取時間間隔大于16毫秒以上的兩個觸控坐標,但不限于此。
步驟s506,根據最后一次移動事件的觸控坐標,前一次移動事件的觸控坐標及時間間隔計算觸控離開速度。
具體的,觸控離開速度vend的計算公式為:
當計算得到觸控離開速度后,在慣性滾動過程中,可實時獲取慣性滾動時間,根據慣性滾動時間實時計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標。
步驟s508,獲取慣性滾動第一階段滾動時間。
具體的,在慣性滾動過程中,內容物在一段時間內按照函數fis(t)的返回值進行運動,即t時刻,慣性滾動過程中的內容物頂部坐標x2=fis(t)。慣性滾動可分為兩個階段,第一階段內容物不拉扯邊緣,當內容物到達邊緣則進入第二階段。慣性滾動第一階段滾動時間即為在第一階段中的當前時刻t。
步驟s510,根據觸控離開速度及第一階段滾動時間計算第一階段慣性滾動位移量。
具體的,在慣性滾動的第一階段,內容物不拉扯邊緣,此時fis(t)≤0或fis(t)+h2≥h1,計算第一階段慣性滾動位移量sis(t),公式可如下所示:
步驟s512,根據最后一次移動事件中計算得到的內容物頂部坐標及第一階段慣性滾動位移量計算慣性滾動過程中的內容物頂部坐標。
具體的,fis(t)=xend+sis(t),則慣性滾動過程中的內容物頂部坐標x2=fis(t)=xend+sis(t)。
步驟s514,在預設時間內,判斷內容物是否到達邊緣,若是,則執(zhí)行步驟s516,若否,則執(zhí)行步驟s508。
具體的,在本實施例中,預設時間可優(yōu)選為1900毫秒,在慣性滾動的第一階段中,0≤t≤1900(毫秒),若內容物在1900毫秒內先到達邊緣,則進入第二階段。若超過預設時間則停止?jié)L動,即若在1900毫秒內還未到達邊緣,則停止?jié)L動。
步驟s516,進入慣性滾動第二階段。
步驟s518,根據最后一次移動事件中計算得到的內容物頂部坐標及觸控離開速度計算慣性滾動第一階段與慣性滾動第二階段的預定總時間。
具體的,令慣性滾動第二階段開始時內容物到達邊緣的距離為d,則有:
令慣性滾動第一階段從內容物開始滾動到內容物到達邊緣所需的時間為t1,令v0=|vend|,則
在慣性滾動第二階段,令慣性滾動第一階段與慣性滾動第二階段的預定總時間為t,則
步驟s520,獲取慣性滾動第二階段滾動時間。
具體的,慣性滾動第二階段滾動時間即為第二階段中的當前時刻t。
步驟s522,根據觸控離開速度及第二階段滾動時間計算第二階段慣性滾動位移量。
具體的,在慣性滾動第二階段,在第二階段中的當前時刻為t(t-t1>0),令第二階段慣性滾動位移量為svs(t),則
步驟s524,根據最后一次移動事件中計算得到的內容物頂部坐標及第二階段慣性滾動位移量計算慣性滾動過程中的內容物頂部坐標。
具體的,在慣性滾動的第二階段,fis(t)=xend+sgn(vend)svs(t),則慣性滾動過程中的內容物頂部坐標x2=fis(t)=xend+sgn(vend)svs(t),其中,sgn為符號函數,其定義如下:
步驟s526,判斷第一階段滾動時間及第二階段滾動時間之和是否大于預定總時間,若是,則執(zhí)行步驟s528,若否,則執(zhí)行步驟s520。
具體的,在慣性滾動的第二階段,需滿足0≤t≤t,針對不同的情況,t的計算形式也不同,當第二階段中的當前時刻大于t時,則停止執(zhí)行慣性滾動,若停止慣性滾動時,內容物處于拉扯邊緣狀態(tài),即會進入回滾,若停止慣性滾動時,內容物不拉扯邊緣,則滾動過程結束。
步驟s528,停止執(zhí)行慣性滾動。
本實施例中,根據接觸物的觸控離開速度來計算內容物頂部坐標,接觸物的觸控離開速度即為運動軌跡的最終速度,使內容物滾動的方向與接觸物離開方向保持一致,不會出現滾動方向與手指運動方向相反的情況。此外,慣性滾動過程中的加速度可以不斷進行變化,不再保持固定值,能使?jié)L動更加流暢。
步驟s150,根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行回滾,若是,則執(zhí)行步驟s160,若否,則執(zhí)行步驟s170。
具體的,當最后一次移動事件中計算得到的內容物頂部坐標xend≠0,則執(zhí)行回滾,即若當前的內容物拉扯邊緣,則執(zhí)行回滾。
步驟s160,獲取回滾時刻,并根據最后一次移動事件中計算得到的內容物頂部坐標及回滾時刻計算并更新回滾過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
如圖6所示,在一個實施例中,步驟s160獲取回滾時刻,并根據最后一次移動事件中計算得到的內容物頂部坐標及回滾時刻計算并更新回滾過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動,具體包括以下步驟:
步驟s602,獲取回滾時刻,根據回滾時刻計算輔助值。
具體的,回滾時刻為回滾過程中的當前時刻,在回滾過程中,內容物在一段時間內按照函數fr(t)的返回值進行運動,即在回滾過程中,t'時刻,回滾過程中的內容物頂部坐標x3=fr(t')。可定義計算fr(t)的輔助函數re(t),內容物按照re(t)所描述的方式,移動到邊緣。re(t)的公式如下所示:
re(t)=0.054989-1.441760×10-9t+0.000035t2-2.418702×10-7t3
+9.064675×10-10t4-1.539225×10-12t5+1.017036×10-15t6。
獲取回滾時刻t',并計算t'時刻的輔助值re(t')。
步驟s604,根據輔助值及最后一次移動事件中計算得到的內容物頂部坐標計算拉伸距離。
具體的,定義計算回滾過程中的拉伸距離的函數如下所示:
其中,
步驟s606,根據拉伸距離計算回滾過程中的內容物頂部坐標。
具體的,若s(xend)>0,則內容物拉扯上邊緣,內容物需向上回滾,則fr(t)=xend-freturn(t),在回滾時刻t'時,此時回滾過程中的內容物頂部坐標x3=xend-freturn(t')。若s(xend)<0,則內容物拉扯下邊緣,內容物需向下回滾,則fr(t)=xend+freturn(t),在回滾時刻t'時,此時回滾過程中的內容物頂部坐標x3=xend+freturn(t')。
步驟s608,判斷內容物是否到達邊緣,若是,則執(zhí)行步驟s610,若否,則執(zhí)行步驟s602。
具體的,若s(xend)>0,則當fr(t)=0時,即表示內容物到達上邊緣,停止執(zhí)行回滾。若s(xend)<0,則當fr(t)=h1-h2時,即表示內容物到達下邊緣,停止執(zhí)行回滾。
步驟s610,停止執(zhí)行回滾。
在本實施例中,能夠根據滾動控件的形狀及大小計算回滾過程中的拉伸距離,使得回滾過程中可以進行變速滾動,滾動過程更加流暢。
在一個實施例中,在步驟s140確定觸控離開速度,根據觸控離開速度計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動之后,還包括步驟:根據慣性滾動過程中計算得到的最新的內容物頂部坐標判斷是否需要執(zhí)行回滾。
具體的,當內容物執(zhí)行完慣性滾動后,若依然處于拉扯邊緣的狀態(tài),則需執(zhí)行回滾。令xend'為慣性滾動過程中計算得到的最新的內容物頂部坐標,若s(xend')≠0,則進入回滾,后續(xù)回滾過程中的內容物頂部坐標的計算方式同步驟s602至步驟s610描述的一致,只需將最后一次移動事件中計算得到的內容物頂部坐標xend替換為xend'即可,在此不再一一贅述。慣性滾動-拉扯邊緣-回滾的過程曲線平滑,使?jié)L動更加流暢。
步驟s170,停止?jié)L動。
上述基于滾動控件實現內容物滾動的方法,根據不同的事件以不同的方式計算內容物頂部坐標,使得在移動事件中的滾動、慣性滾動及回滾過程中,滾動控件中的內容物隨著內容物頂部坐標的變化不斷進行滾動;并且,在慣性滾動中,根據觸控離開速度計算慣性滾動位移量,并計算慣性滾動過程中的內容物頂部坐標,能夠根據接觸物運動軌跡進行計算,使內容物滾動的方向與接觸物離開方向保持一致,不會出現滾動方向與手指運動方向相反的情況,使?jié)L動更流暢。
進一步地,上述基于滾動控件實現內容物滾動的方法在移動事件中的滾動、慣性滾動及回滾過程中,內容物隨著接觸物的移動滾動-慣性滾動-回滾的曲線平滑,滾動流暢,有利于提高用戶體驗。
此外,該方法中計算量小,在實際運用中,即使將滾動計算邏輯和渲染線程放在同一個線程中,滾動的運算量可忽略不計,不會導致卡頓的現象,滾動效果流暢。
如圖7所示,一種基于滾動控件實現內容物滾動的裝置,包括接觸模塊710、移動模塊720、抬起模塊730、慣性滾動模塊740和回滾模塊750。
接觸模塊710,用于接收接觸事件,停止?jié)L動滾動控件中的內容物并記錄當前的內容物頂部坐標。
移動模塊720,用于接收移動事件,獲取移動事件中對應的觸控坐標,并根據觸控坐標計算并更新內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
抬起模塊730,用于接收抬起事件,并根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行慣性滾動。
慣性滾動模塊740,用于若執(zhí)行慣性滾動,則確定觸控離開速度,根據觸控離開速度計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
回滾模塊750,用于根據最后一次移動事件中計算得到的內容物頂部坐標判斷是否執(zhí)行回滾,若執(zhí)行回滾,則獲取回滾時刻,并根據最后一次移動事件中計算得到的內容物頂部坐標及回滾時刻計算并更新回滾過程中的內容物頂部坐標,以使內容物隨著內容物頂部坐標滾動。
上述基于滾動控件實現內容物滾動的裝置,根據不同的事件以不同的方式計算內容物頂部坐標,使得在移動事件中的滾動、慣性滾動及回滾過程中,滾動控件中的內容物隨著內容物頂部坐標的變化不斷進行滾動;并且,在慣性滾動中,根據觸控離開速度計算慣性滾動位移量,并計算慣性滾動過程中的內容物頂部坐標,能夠根據接觸物運動軌跡進行計算,使內容物滾動的方向與接觸物離開方向保持一致,不會出現滾動方向與手指運動方向相反的情況,且內容物隨著接觸物的移動滾動-慣性滾動-回滾的曲線平滑,滾動更加流暢。
如圖8所示,在一個實施例中,上述基于滾動控件實現內容物滾動的裝置,除了包括接觸模塊710、移動模塊720、抬起模塊730、慣性滾動模塊740和回滾模塊750以外,還包括建立模塊760。
建立模塊760,用于預先建立滾動控件,滾動控件包括背景區(qū)域及內容物區(qū)域,內容物區(qū)域疊加在背景區(qū)域上,內容物區(qū)域的長度大于背景區(qū)域的長度。
上述基于滾動控件實現內容物滾動的裝置,通過建立雙層結構的滾動控件,且使內容物區(qū)域的長度大于背影區(qū)域的長度,方便后續(xù)內容物滾動過程中計算內容物頂部坐標,使得滾動過程更加流暢,且計算方式簡單,計算量小。
如圖9所示,移動模塊720包括獲取單元721、接收單元723、確定單元725、判斷單元727和處理單元729。
獲取單元721,用于獲取當前的內容物頂部坐標與接觸事件中對應的觸控坐標。
接收單元723,用于接收移動事件,并獲取移動時刻的新的觸控坐標。
確定單元725,用于根據新的觸控坐標及接觸事件中對應的觸控坐標確定觸控位移量。
判斷單元727,用于根據當前的內容物頂部坐標判斷內容物在當前狀態(tài)下是否拉扯邊緣。
處理單元729,用于若內容物在當前狀態(tài)下拉扯邊緣,則根據當前的內容物頂部坐標計算假定拉扯距離,并根據假定拉扯距離及觸控位移量判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,則根據假定拉扯距離與觸控位移量計算拉伸距離,并根據拉伸距離計算新的內容物頂部坐標,若否,則根據假定拉扯距離與觸控位移量計算新的內容物頂部坐標。
處理單元729還用于若內容物在當前狀態(tài)下不拉扯邊緣,則根據當前的內容物頂部坐標與觸控位移量之和判斷內容物在假定狀態(tài)下是否拉扯邊緣,若是,則根據當前的內容物頂部坐標與觸控位移量計算拉伸距離,并根據拉伸距離計算新的內容物頂部坐標,若否,則根據當前的內容物頂部坐標與觸控位移量計算新的內容物頂部坐標。
上述基于滾動控件實現內容物滾動的裝置,根據移動事件中對應的觸控坐標計算觸控位移量,并根據內容物在不同狀態(tài)下是否拉扯邊緣分不同情況計算新的內容物頂部坐標,使得滾動過程中內容物的滾動更加流暢,使用戶在滑動時擁有更好的手感。
如圖10所示,慣性滾動模塊740包括獲取單元410、速度計算單元420和處理單元430。
獲取單元410,用于分別獲取最后一次移動事件的觸控坐標及前一次移動事件的觸控坐標。
獲取單元410還用于獲取最后一次移動事件的移動時刻與前一次移動事件的移動時刻的時間間隔。
速度計算單元420,用于根據最后一次移動事件的觸控坐標、前一次移動事件的觸控坐標及時間間隔計算觸控離開速度。
處理單元430,用于獲取慣性滾動時間,根據慣性滾動時間計算慣性滾動位移量,并根據最后一次移動事件中計算得到的內容物頂部坐標及慣性滾動位移量計算并更新慣性滾動過程中的內容物頂部坐標。
如圖11所示,在一個實施例中,處理單元430包括時間獲取子單元302、第一位移量計算子單元304、第一坐標計算子單元306、判斷子單元308、總時間計算子單元310、第二位移量計算子單元312、第二坐標計算子單元314及停止子單元316。
時間獲取子單元302還用于獲取慣性滾動第一階段滾動時間。
第一位移量計算子單元304,用于根據觸控離開速度及第一階段滾動時間計算第一階段慣性滾動位移量。
第一坐標計算子單元306,用于根據最后一次移動事件中計算得到的內容物頂部坐標及第一階段慣性滾動位移量計算慣性滾動過程中的內容物頂部坐標。
判斷子單元308,用于在預設時間內,判斷內容物是否到達邊緣,若到達邊緣,則進入慣性滾動第二階段。
總時間計算子單元310,用于根據最后一次移動事件中計算得到的內容物頂部坐標及觸控離開速度計算慣性滾動第一階段與慣性滾動第二階段的預定總時間。
時間獲取子單元302還用于獲取慣性滾動第二階段滾動時間。
第二位移量計算子單元312,用于根據觸控離開速度及第二階段滾動時間計算第二階段慣性滾動位移量。
第二坐標計算子單元314,用于根據最后一次移動事件中計算得到的內容物頂部坐標及第二階段慣性滾動位移量計算慣性滾動過程中的內容物頂部坐標。
停止子單元316,用于當第一階段滾動時間及第二階段滾動時間之和大于預定總時間,則停止執(zhí)行慣性滾動。
上述基于滾動控件實現內容物滾動的裝置,在慣性滾動過程中,根據接觸物的觸控離開速度來計算內容物頂部坐標,接觸物的觸控離開速度即為運動軌跡的最終速度,使內容物滾動的方向與接觸物離開方向保持一致,不會出現滾動方向與手指運動方向相反的情況。此外,慣性滾動過程中的加速度可以不斷進行變化,不再保持固定值,能使?jié)L動更加流暢。
如圖12所示,回滾模塊750包括輔助值計算單元752、距離計算單元754、坐標計算單元756和回滾停止單元758。
輔助值計算單元752,用于獲取回滾時刻,根據回滾時刻計算輔助值。
距離計算單元754,用于根據輔助值及最后一次移動事件中計算得到的內容物頂部坐標計算拉伸距離。
坐標計算單元756,用于根據拉伸距離計算回滾過程中的內容物頂部坐標。
回滾停止單元758,用于當內容物到達邊緣時,則停止執(zhí)行回滾。
在一個實施例中,回滾模塊750還用于根據慣性滾動過程中計算得到的最新的內容物頂部坐標判斷是否需要執(zhí)行回滾。
上述基于滾動控件實現內容物滾動的裝置,能夠根據滾動控件的形狀及大小計算回滾過程中的拉伸距離,使得回滾過程中可以進行變速滾動,滾動流暢。且在慣性滾動-拉扯邊緣-回滾的過程中曲線平滑,使?jié)L動更加流暢。此外,滾動過程中的計算量小,在實際運用中,即使將滾動計算邏輯和渲染線程放在同一個線程中,也不會導致卡頓的現象,滾動效果流暢。
以上所述實施例的各技術特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術特征所有可能的組合都進行描述,然而,只要這些技術特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。
以上所述實施例僅表達了本發(fā)明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發(fā)明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發(fā)明構思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權利要求為準。