2015-01-17 80 views
1

我有一個自定義相對佈局,我可以拖放一些 按鈕。我開始拖動我的onTouch:刪除或取消DragShadow

/** 
* 
*/ 
@Override 
public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN : { 
      ClipData data = ClipData.newPlainText("", ""); 
      ImageButton imageButton = (ImageButton)view; 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(imageButton); 

      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
     } break; 
     case MotionEvent.ACTION_UP: { 
      view.performClick(); 
      view.setVisibility(View.VISIBLE); 
     } break; 
    } 

    return true; 
} 

正如你所看到的我創建一個DragShadow。我現在有一個小問題,因爲我定義了一個拖拽區域。當用戶拖動按鈕進行拖動區域的拖動被取消:

/** 
    * 
    */ 
    @Override 
    public boolean onDrag(View view, DragEvent event) { 
     View sourceView = (View) event.getLocalState(); 

     float sourceX = sourceView.getX(); 
     float sourceY = sourceView.getY(); 
     float dropX = event.getX() - (sourceView.getWidth()/2); 
     float dropY = event.getY() - (sourceView.getHeight()/2); 

     switch(event.getAction()) { 
      case DragEvent.ACTION_DRAG_EXITED : { 
       TranslateAnimation animation = new TranslateAnimation(dropX - sourceX, 0, dropY - sourceY, 0); 
       animation.setDuration(300); 

       sourceView.startAnimation(animation); 
       sourceView.setX(sourceX); 
       sourceView.setY(sourceY); 
       sourceView.setVisibility(View.VISIBLE); 
      } break; 
      case DragEvent.ACTION_DROP : { 
       sourceView.setX(dropX); 
       sourceView.setY(dropY); 
       sourceView.setVisibility(View.VISIBLE); 

       TranslateAnimation animation = new TranslateAnimation(dropX - sourceX, 0, dropY - sourceY, 0); 
       animation.setDuration(300); 

       sourceView.startAnimation(animation); 
       sourceView.setX(sourceX); 
       sourceView.setY(sourceY); 
      } break; 
     } 

     return true; 
    } 
} 

因此,當用戶離開該阻力區域的按鈕被使用動畫自動移回原來的位置。問題是DragShadow仍然可見,我找不到方法來刪除或取消DragShadow。只要用戶觸摸屏幕,DragShadow就可見。

那麼,如何在ACTION_DRAG_EXITED被觸發時以編程方式取消或刪除DragShadow?

回答

1

沒有辦法做到這一點。 Android拖影的可悲事實是它一旦創建就無法更改。 (我試圖創建一個視覺上可以響應其他視圖的拖動陰影時遇到了這個問題)。你有兩個選擇:

1:最簡單的解決方案是不嘗試取消ACTION_DRAG_EXITED上的拖動。它違背了Android的設計模式,似乎這樣做可能會讓用戶惱火。除非你有充分的理由需要這個功能,否則我會說離開它。

編輯:我以前說過,你可以檢查看是否在視圖中的放置點。有一個更簡單的方法來實現這一點:

當用戶放棄陰影時,無論是否處於正在監聽拖動事件的視圖中,都會發送ACTION_DRAG_ENDED。如果ACTION_DROP在偵聽視圖中釋放,它也會被髮送。

所以你想要做的只是讓代碼將按鈕移動到ACTION_DROP上的新位置,並讓動畫在ACTION_DRAG_ENDED上運行。無論按鈕是否移動到新位置,動畫都會運行。

2:滾動您自己的拖放代碼。這並不難,有很多教程,並且如果你願意去掉兔子洞,它會打開一個可能的世界(例如多指拖放)。我發現它是一個很好的學習體驗。