2016-02-12 17 views
0

我有一個問題,我一直無法解決,我非常滿意。當用戶在邊界附近拖動對象時滾動列表

我有一種觀點,我拖放到列表中。該列表是使用recyclerView創建的。拖動對象工作正常,recyclerView的項目都可以接收事件沒有問題。現在我想讓用戶將他們的手指拖動到列表頂部或底部附近時進行滾動。我的第一步是將dragEvent偵聽器添加到recyclerView,並在每次獲得靠近頂部或底部邊緣的位置時嘗試開始滾動。所以,我的DragEvent.Location案例看起來像這樣:

case DragEvent.ACTION_DRAG_LOCATION: { 

      removeDragScrollCallBack(); 

      float y = event.getY(); 
      final int scrollAreaHeight = v.getHeight()/4; 
      final int delayMills = 16; 
      int scrollAmount = 0; 

      if (y > v.getHeight() - scrollAreaHeight) { 
       scrollAmount = 10; 
      } else if (y < scrollAreaHeight) { 
       scrollAmount = -10; 
      } 

      if (Math.abs(scrollAmount) > 0) { 

       final int finalScrollAmount = scrollAmount; 

       dragScrollRunnable = new Runnable() { 
        @Override 
        public void run() { 

         if (canScrollVertically(finalScrollAmount)) { 
          scrollBy(0, finalScrollAmount); 

          if (dragScrollHandler != null && dragScrollRunnable != null) { 
           dragScrollHandler.postDelayed(this, delayMills); 
          } 
         } 
        } 
       }; 

       dragScrollRunnable.run(); 
      } 

      return true; 
     } 

它有點作品。事情朝着正確的方向滾動。它似乎有些嘲笑,而且一般不會很順利地滾動。此外,回收站視圖仍在滾動時,拖放放置事件有時不會傳遞給子節點。

所以,我去使用列表視圖 - link做類似的事情的谷歌的例子。我修改了他們用於列表視圖的代碼,並嘗試以類似的方式處理我的recyclerView。這對我來說結果甚至更差。

我已經嘗試過各種這些技術的其他改動,並換成使用smoothScroll函數而不是標準滾動函數,但我對任何結果都不滿意。

有沒有人有如何處理這個好的解決方案?

更新:我現在認爲我的這個功能的許多問題是由於拖動監聽器相當不可靠。在兒童接收事件時,有時回收商未能收到事件。

回答

0

原來,視圖上的拖動監聽器並不十分可靠。隨着我在屏幕上移動手指,隨機時間,拖動監聽器不會收到所有事件。我相信這樣做的原因是回收商View的孩子也接受了拖動回調。解決的辦法是做我最初嘗試過的東西,但通過片段本身的聽衆。現在,當我得到一個事件時,我檢查座標以查看它在哪個視圖中,然後將其轉換爲該視圖的本地座標。然後我可以確定我需要如何處理它。

相關問題