我有一个充满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;
}
答案 0 :(得分:8)
您可以遍历父容器中的所有控件,并将每个子节点与当前的X,Y进行比较。您可以通过调用以下内容来获取视图边界:
这样的事情:
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));
}