我希望有一個可拖動的視圖,同時能夠不斷監視到「目標」視圖的距離並檢測拖動視圖拖動到目標視圖上的時間。我的想法是獲得兩個視圖的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;
}
}
爲什麼使用textViewRect的lastX和lastY偏移量而不是imageViewRect?你嘗試刪除它們嗎? –