2016-01-21 45 views
0

我有一個片段中的圖像,我想在片段中左右移動。我想做更多,但我簡化了我的代碼以顯示我的問題。這是我的代碼:拖放 - 爲什麼我會得到多個ACTION_DRAG_LOCATION事件?

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_main, container, false); 

    View imageLayout = v.findViewById(R.id.img1); 
    imageLayout.setOnDragListener(new ImageDragEventListener()); 
    imageLayout.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder dragShadowBuilder = new View.DragShadowBuilder(); 
      v.startDrag(data, dragShadowBuilder, null, 0); 
      return true; 
     } 
    }); 

    return v; 
} 

private class ImageDragEventListener implements View.OnDragListener { 

    int originLeft = 0; 
    float originX = 0; 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     final int action = event.getAction(); 
     switch (action) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       originLeft = v.getLeft(); 
       originX = event.getX(); 
       return true; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       return true; 
      case DragEvent.ACTION_DRAG_LOCATION: 
       float currentX = event.getX(); 
       Log.i(TAG, "currentX= " + currentX); 
       int deltaLeft = (int) (currentX - originX); 
       v.setLeft(originLeft + deltaLeft); 
       return true; 
      case DragEvent.ACTION_DRAG_EXITED: 
       return true; 
      case DragEvent.ACTION_DROP: 
       return true; 
      case DragEvent.ACTION_DRAG_ENDED: 
       return true; 
      default: 
       break; 
     } 
     return false; 
    } 
} 

這是我的輸出:

01-21 18:04:52.291 8486-8486/com.testdnd I/Fragment﹕ currentX= 971.14844 
01-21 18:04:52.291 8486-8486/com.testdnd I/Fragment﹕ currentX= 671.39844 
01-21 18:04:52.311 8486-8486/com.testdnd I/Fragment﹕ currentX= 982.2969 
01-21 18:04:52.321 8486-8486/com.testdnd I/Fragment﹕ currentX= 692.3906 
01-21 18:04:52.341 8486-8486/com.testdnd I/Fragment﹕ currentX= 993.28906 
01-21 18:04:52.361 8486-8486/com.testdnd I/Fragment﹕ currentX= 714.4375 
01-21 18:04:52.371 8486-8486/com.testdnd I/Fragment﹕ currentX= 1005.3906 
01-21 18:04:52.391 8486-8486/com.testdnd I/Fragment﹕ currentX= 738.2969 
01-21 18:04:52.411 8486-8486/com.testdnd I/Fragment﹕ currentX= 1016.1953 
01-21 18:04:52.421 8486-8486/com.testdnd I/Fragment﹕ currentX= 760.34375 
01-21 18:04:52.441 8486-8486/com.testdnd I/Fragment﹕ currentX= 1037.4375 
01-21 18:04:52.461 8486-8486/com.testdnd I/Fragment﹕ currentX= 770.28125 
01-21 18:04:52.471 8486-8486/com.testdnd I/Fragment﹕ currentX= 1057.3203 
01-21 18:04:52.491 8486-8486/com.testdnd I/Fragment﹕ currentX= 780.16406 

我得到每個手指運動兩個事件,並因此當我移動它的圖像閃爍。

爲什麼會發生這種情況,我該如何預防它?

回答

0

好的,所以我最終弄明白了。

我得到兩個事件,因爲我圍繞圖像本身移動,出於某種原因,我得到的事件給了我0到我手指的距離,另一個給了我從圖像左邊位置到手指的距離。

解決方案是在xml中添加包含圖像的佈局,並在佈局上設置拖動偵聽器和觸摸偵聽器,但移動圖像。這樣,我只能得到一種類型的事件,因爲被拖動的視圖實際上並沒有移動。