使用x,y坐标查找布局

时间:2011-11-30 17:08:48

标签: android button

我有一个充满Android自定义按钮的应用。我想允许用户重新排列这些按钮,如Home或Application面板的图像按钮。

我对此进行了研究,发现我可以使用drag& amp;删除与用户动作交互的功能。但在我的情况下,父布局可能会有所不同。在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 个答案:

答案 0 :(得分:8)

您可以遍历父容器中的所有控件,并将每个子节点与当前的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代码,需要根据您使用的任何内容进行调整(即为嵌套控件添加递归)。

希望有所帮助。

答案 1 :(得分:2)

我建议循环使用根XML并查看任何包含的ViewGroup的可见坐标;像这样的东西,虽然这是未经测试的:

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);

答案 2 :(得分:0)

我建议使用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));
}