Witajcie świątecznie,
na scenie mam dwa obiekty ImageView. Idea jest taka, że przeciągając obiektA nad obiektB, po zwolnieniu palca, ma zostać sprawdzone czy obiektA dotyka obiektuB.
Problemu nie byłoby gdybym używał pary zdarzeń: setOnLongClickListener i setOnDragListener, ale ja chce użyć metod:
obiektA.setOnTouchListener(new ChoiceTouchListener());
obiektB.setOnDragListener(dragListener);
private class ChoiceTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
v.setLayoutParams(layoutParams);
break;
}
// activity_root.invalidate();
return true;
}
}
View.OnDragListener dragListener = new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
final View view = (View) event.getLocalState();
switch (dragEvent) {
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DRAG_ENDED:
break;
case DragEvent.ACTION_DROP:
if (view.getId() == R.id.puzel1 && v.getId() == R.id.iv_item1) {
// Toast.makeText(MainActivity.this, "1", Toast.LENGTH_LONG).show();
}
break;
}
return true;
}
};
I niestety metoda dragListener nie jest wykrywana (bo nie ma akcji startDrag)... Czy jest jakiś inny sposób aby przy metodzie setOnTouchListener wykrywać zdarzenia przypisane do drag listenera (np. ACTION_DROP).
Nigdzie w necie nie spotkałem się z taką kombinacją a nie chcę używać kodu:
View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData data = ClipData.newPlainText("","");
View.DragShadowBuilder myShadow = new View.DragShadowBuilder(v);
v.startDrag(data, myShadow, null, 0);
// v.setVisibility(View.INVISIBLE);
return true;
}
};
bo ni wiem jak za jego pomocą dragować obiekt a nie jego shadow.
Pozdrawiam
Marcin