2016-08-28 77 views
0

我希望有一個可拖動的視圖,同時能夠不斷監視到「目標」視圖的距離並檢測拖動視圖拖動到目標視圖上的時間。我的想法是獲得兩個視圖的Rect's並使用intersect()來檢查它們是否觸摸。然而,我的實現並不順利 - 有時候它檢測到錯誤位置的重疊或者沒有檢測到重疊的結束。 你能告訴我我做錯了什麼或者可能導致正確的做法嗎? (我不能使用startDrag(),因爲它不允許拖動時監視事件)。如何實現一個View被拖到另一個視圖上的檢測?

代碼在onCreate

//find UI 
myTextView = (TextView) findViewById(R.id.textView); 
myImageView = (ImageView) findViewById(R.id.imageView); 

//assign touch listener 
myTextView.setOnTouchListener(new MyTouchListener()); 

代碼MyTouchListener

class MyTouchListener implements View.OnTouchListener { 

     //last coordinates 
     float lastX; 
     float lastY; 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 

      switch (motionEvent.getAction()) { 
       case MotionEvent.ACTION_DOWN: { 
        view.bringToFront(); 
        lastX = motionEvent.getRawX(); 
        lastY = motionEvent.getRawY(); 
       } 

       case MotionEvent.ACTION_MOVE: { 

        //motion difference 
        float deltaX = motionEvent.getRawX() - lastX; 
        float deltaY = motionEvent.getRawY() - lastY; 

        //set new last coordinates 
        lastX = motionEvent.getRawX(); 
        lastY = motionEvent.getRawY(); 

        //animate view to new location 
        view.animate().translationXBy(deltaX).translationYBy(deltaY).setDuration(0).start(); 

        //get Rects 
        Rect textViewRect = new Rect((int)lastX+myTextView.getLeft(), (int)lastY+myTextView.getTop(), (int)lastX+myTextView.getRight(), (int)lastY+myTextView.getBottom()); 
        Rect imageViewRect = new Rect(myImageView.getLeft(), myImageView.getTop(), myImageView.getRight(), myImageView.getBottom()); 


        if (imageViewRect.intersect(textViewRect)) { 
         myImageView.setImageDrawable(getResources().getDrawable(android.R.drawable.ic_dialog_info)); 
        } else { 
         myImageView.setImageDrawable(getResources().getDrawable(android.R.drawable.ic_delete)); 
        } 
       } 
      } 

      return true; 
     } 
    } 
+0

爲什麼使用textViewRect的lastX和lastY偏移量而不是imageViewRect?你嘗試刪除它們嗎? –

回答

0

動畫翻譯是不必要的,因爲觸摸事件應該平穩地移動的TextView有關。只需將新的X,Y座標分配給TextView,如下所示:

view.setX(view.getX() + deltaX); 
view.setY(view.getY() + deltaY); 
+0

關於替換'animate()'是正確的 - 我可以通過設置X,Y來拖動它,但是這仍然不會改變有關檢測一個視圖被拖動到另一個視圖上的行爲。 – wilkas

+0

我知道座標有問題。我設法發現,當檢索getRawY和設置拖動視圖的矩形時,我需要考慮活動條和狀態欄高度,但仍然無法正確地將矩形相交:(。 – wilkas

+0

您從哪個視圖接收觸摸事件?你應該使用任何視圖是你正在拖動或相交的視圖的父親 –

相關問題