Найти макет с координатами x, y - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть приложение, заполненное пользовательскими кнопками для Android. Я хотел бы разрешить пользователю изменять расположение этих кнопок, например кнопок изображений на панели «Домой» или «Панель приложений».

Я исследовал это и обнаружил, что могу использовать функцию перетаскивания для взаимодействия с движением пользователя. Но в моем случае родительский макет может быть другим. OnMove или OnDrop, мне нужно переместить эту кнопку в соответствующий макет.

Итак, вопрос , как мне найти макет, содержащий координаты x & y, и вставить в него кнопку.

@Override
public boolean onTouchEvent(MotionEvent event) {


    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        status = START_DRAGGING;
        break;
    case MotionEvent.ACTION_UP:
        status = STOP_DRAGGING;
        break;
    case MotionEvent.ACTION_MOVE:
        if(status == START_DRAGGING){
            //parentLayout.setPadding((int)event.getRawX(), 0,0,0);
            //**What to do here**
            parentLayout.invalidate();
        }                           
        break;

    }

    return true;
}

Ответы [ 3 ]

8 голосов
/ 30 ноября 2011

Вы можете просмотреть все элементы управления в родительском контейнере и сравнить границы каждого дочернего элемента с текущими значениями X, Y. Вы можете получить границы представлений, вызвав это:

View.getHitRect ()

Примерно так:

for(View v : parent.children())
{
    // only checking ViewGroups (layout) obviously you can change
    // this to suit your needs
    if(!(v instanceof ViewGroup))
        continue;

    if(v.getHitRect().contains(x, y))
        return v;
}

Это просто Psuedo-код, и его нужно будет адаптировать к тому, что вы используете (т. Е. Добавьте рекурсию для вложенных элементов управления).

Надеюсь, это поможет.

2 голосов
/ 30 ноября 2011

Я бы предложил что-то перебрать в корневом XML и проверить видимые координаты любых содержащихся ViewGroups;как то так, хотя это не проверено:

ViewGroup root = (ViewGroup)findViewById(R.id.id_of_your_root_viewgroup);
//get event coordinates as int x, int y

public ViewGroup findContainingGroup(ViewGroup v, int x, int y) {
    for (int i = 0; i < v.getChildCount(); i++) {
        View child = v.getChildAt(i);
        if(child instanceof ViewGroup) {
            Rect outRect = new Rect();
            child.getDrawingRect(outRect);
            if(outRect.contains(x, y)) return child;
        }
    }
}

ViewGroup parent = findContainingGroup(root, x, y);
0 голосов
/ 30 ноября 2011

Я бы предложил использовать TableLayout.Поскольку он состоит из строк и столбцов, вы можете динамически изменять их порядок, вставляя / удаляя строки или столбцы и перестраивая весь макет на лету.

Но это, вероятно, означает, что вам придется устанавливать макет программно, яКак это можно сделать из макета XML.

(псевдокод ниже)

if (dropping button) {
    calculate new layout based on which row/column button was moved, and where it was dropped;
    generate new layout (TableLayout --> addRow --> addView);
    apply it to buttons view (Buttons.setView(TableLayoutView));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...