В моем приложении для Android у меня есть ImageView поверх отдельной LinearLayout в качестве точки «появления». Вокруг «spawn» больше LinearLayouts.
Допустим, ImageView называется "синим", и есть еще 2 LinearLayouts. Один называется «blueArea», а другой - «redArea». Таким образом, если синий будет добавлен в blueArea, действие начнется. Если синий упадет в redArea, начнется другое действие.
Я в основном хочу, чтобы мои капли знали, что падает и куда падает. Что я могу сделать, чтобы «пометить» ImageViews и LinearLayouts, чтобы я мог определить, когда представление находится на макете? и как я могу это сделать?
Вот то, что я придумал до сих пор.
// R.drawable.blue is the ImageView.
// R.id.blue is the LinearLayout.
public View blue = findViewById(R.drawable.blue);
findViewById(R.id.blue).setOnTouchListener(new TouchListener());
findViewById(R.id.blueArea).setOnDragListener(new DragListener());
findViewById(R.id.redArea).setOnDragListener(new DragListener());
findViewById(R.id.spawn).setOnDragListener(new DragListener());
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder;
private final class TouchListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(data, shadowBuilder, v, 0);
v.setVisibility(View.INVISIBLE);
}
return true;
}
}
boolean containsDraggable = true;
class DragListener implements OnDragListener {
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
View view = (View) event.getLocalState();
if (action == DragEvent.ACTION_DRAG_STARTED) {
}
if (action == DragEvent.ACTION_DRAG_ENTERED) {
containsDraggable = true;
}
if (action == DragEvent.ACTION_DRAG_EXITED) {
containsDraggable = false;
}
if (action == DragEvent.ACTION_DRAG_LOCATION) {
// TODO
}
if (action == DragEvent.ACTION_DRAG_ENDED) {
if (dropEventNotHandled(event)) {
view.setVisibility(View.VISIBLE);
}
}
if (action == DragEvent.ACTION_DROP && containsDraggable) {
view.setVisibility(View.VISIBLE);
releaseTrue();
}
return true;
}
}
private boolean dropEventNotHandled(DragEvent event) {
return !event.getResult();
}
public void releaseTrue() {
score++;
textScore.setText(String.valueOf(score));
}
public void releaseFalse() {
score--;
textScore.setText(String.valueOf(score));
}