Используя Drag and Drop для определения личности? - PullRequest
2 голосов
/ 21 марта 2012

В моем приложении для 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));
    }

1 Ответ

2 голосов
/ 02 августа 2012

, поскольку вы добавляете

.setOnDragListener(new DragListener());

для всех трех представлений

public boolean onDrag(View v, DragEvent event) {

будет вызываться с тремя вышеупомянутыми представлениями (т. Е. Представление v)

, чтобы выможет иметь оператор switch, если вы хотите вести себя по-другому.

switch(v.getId()){
case R.id.blueArea:
//action for blue..
break
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...