2010-08-24 46 views
7

我對Android應用程序開發非常陌生,我一直在使用Android的SimpleOnGestureListener和ViewFlipper進行滑動手勢。有3個ViewFlipper子項,每個子項都是一個ScrollView。當活動加載時,它們都會動態填充,並且在此之後它們不會更改。 ScrollView是SimpleOnGestureListeners的附件。當滾動條太短而無法滾動時,Scrollview不會滑動

下面是我使用的佈局:
+ ViewFlipper
++滾動型(X3,每個頁面,每個具有以下:)
+++的LinearLayout(垂直)
++++ TextView的
++++ TableLayout(動態填充W/TableRows)
++++查看

我擴展了通用教程代碼,你可以找到任何地方在線onFling方法,它的偉大工程 - 除了當其中一個ScrollViews沒有足夠的內容進行滾動湖

我已經縮小了問題的範圍,通過在SimpleOnGestureListener的每個方法上重寫和調用super來添加打印到日誌來觸摸檢測。

當我在滾動的頁面上滑動時,我會在onScroll的「onScroll」中得到一些「onClick」中的內容。「在頁面上太短而無法滾動時,我會在onShowPress中」onClick「 「onLongPress」,這只是當我觸摸內容太短的scrollview的孩子 - 如果我碰別處我根本沒有得到任何事件。

想法是什麼問題,或者如何檢測滑動手勢,無論ScrollView有多大?

編輯:我已經確定,當我在Android 2.2模擬器上運行此操作時,與我一直使用的Android 2.1u1 DroidX仿真器相反,它會消失。這在多個環境中是可重現的。


我對此有更多的瞭解;看起來好像onInterceptTouchEvent沒有爲每個運動事件調用,當滾動視圖包含在鰭狀肢(或WorkspaceView)中時。

特別是,我發現在修改另一個視圖類來解決這個同樣的問題的行爲(這是不是唯一的腳蹼)如下 - 注意,這是Android 2.1的只有:

如果滾動視圖足夠長的時間可以滾動,ACTION_DOWN運動事件被ScrollView捕獲,並且每個後續的ACTION_MOVE事件都會經過鰭狀肢的onInterceptTouchEvent,在那裏被截取並正確處理。在android 2.2中,無論滾動長度如何,都會發生這種情況。

回到2.1:如果滾動視圖不夠長滾動的ACTION_DOWN運動事件通過滾動視圖抓住了,而是又回到了腳蹼的的onTouchEvent。所有後續的具有相同手勢的ACTION_MOVE事件跳過 onInterceptTouchEvent函數並直接進入onTouchEvent函數!

我解決這個問題的方法是將我在onTouchEvent中爲ACTION_MOVE事件創建的功能重構並將其重構爲其自己的方法。通過這種方式,如果檢測到事件先前未處理,我可以讓onTouchEvent調用onInterceptTouchEvent,然後調用該功能。

case MotionEvent.ACTION_MOVE: 

       if (touchState == TOUCH_STATE_SCROLLING) { 
        handleScrollMove(ev); 
       } else { 
    //    Log.d("workspace","caught a move touch event but not scrolling"); 
        //NOTE: We will never hit this case in Android 2.2. This is to fix a 2.1 bug. 
        //We need to do the work of interceptTouchEvent here because we don't intercept the move 
        //on children who don't scroll. 

        Log.d("workspace","handling move from onTouch"); 

        if(onInterceptTouchEvent(ev) && touchState == TOUCH_STATE_SCROLLING){ 
         handleScrollMove(ev); 
        } 

       } 

       break; 

這是WorkspaceView.java(Android的Workspace.java的修改,在對谷歌代碼雄的視圖項目中發現,現在這裏:Horizontal "tab"ish scroll between views)。在我們收到一個移動事件的情況下,我們正在滾動(這隻發生在我們故意選擇攔截它的情況下 - 即它被設置在攔截函數中,所以我們已經進入攔截函數),我們執行我們渴望的舉動行爲。如果我們在這裏收到一個移動事件並且我們沒有滾動,那麼我們通過onIntercept返回事件,然後看看我們現在是否設置爲滾動。如果是這樣,我們執行該操作。

這不是優雅,但它的作品!

回答

7

我需要創建一個擴展的滾動型的新類,並用這樣的:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return gestureDetector.onTouchEvent(event); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev){ 
    gestureDetector.onTouchEvent(ev); 
    super.dispatchTouchEvent(ev); 
    return true; 
} 

我不知道爲什麼,但如果我嘗試在dispatchTouchEvent返回任何東西,但真(順理成章的事情會一直到

return (gestureDetector.onTouchEvent(ev) || super.dispatchTouchEvent(ev)); 

如果我理解正確),這是行不通的,而這樣做。

1

嘗試在您的佈局xml中爲每個ScrollView s設置android:fillViewport="true"。這告訴ScrollView是因爲它是包含在視圖大

+0

它被設置爲所有的孩子。我甚至直接複製和粘貼XML在http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+PlanetAndroidCom+(Planet+Android)和嘗試它作爲一個孩子的看法。經過一番搗鼓之後,我設法讓它們都填滿了視口。但是即使他們這樣做,也沒有回調的機會。到目前爲止,沒有滾動條=沒有onFling。 – 2010-08-24 23:39:39