我如何在Android中创建自定义容器视图?

我想用一个听众创建一个视图,有点像容器或杂货袋。 拖入其中的任何图像或文本都会被收集并保存到本地数据库中。 或者更确切地说保存图像名称或字符串。 我之前创建了自定义视图,显示了一个自定义的数据行,但我不知道如何创建一个“杂货袋”types的视图。 我搜索过谷歌创建一个带有监听器的自定义容器视图但找不到与我要查找的内容有关的任何内容。 我不是要求任何人为我做这件事,只是给我一些建议或推进正确的方向。

编辑只是为了澄清一点。 我已经知道如何拖放视图了。 问题是你可以放在任何地方。 我想要的是一个视图,当某个东西在其边界内被删除时,它会获得视图的字符串或标记。 无论可能是什么样的观点。 不知何故,这个自定义视图必须知道在其边界内删除了哪种视图,并在drop上删除该视图。

     

您需要一种方法来确定两个视图是否重叠。 例如,当目标视图和拖动的项目视图在同一容器视图中是2个不同的视图时,类似这些方法的东西可以起作用:

 private Rect getScreenBounds(View view) { int[] location = new int[2]; view.getLocationOnScreen(location); return new Rect(location[0], location[1], location[0] + view.getWidth(), location[1] + view.getHeight()); } private boolean doViewsIntersect(View dropTarget, View item) { Rect dropRect = getScreenBounds(dropTarget); Rect itemRect = getScreenBounds(item); return Rect.intersects(dropRect, itemRect); } 

但是,如果被拖动的视图是容器上的子视图,并且该容器具有您想要执行拖放逻辑的特殊命中区域,那么您可以使用该命中区域的Rect进行交叉测试。

要在View上保存信息,您有以下几种选择:

  • 您可以使用view.setTag(key, object)view.getTag(key)来存储您在每个项目上的任何信息。
  • 如果要为项使用自定义类,则只需添加一个方法即可从视图类中获取数据。
  • 如果为项使用多个不同的类,则可以创建一个接口,并在每个可拖动的视图类上实现该接口。

在项目的发布上,您可以检查区域/视图是否相交,如果它们相交,则可以根据需要从拖动项目中获取所需的任何信息,使用getTag或添加到视图中的方法。

例如,当您收到onTouchListener事件时,可以通过onTouchListener触发此操作。 以下是您可以在每个项目上添加的侦听器示例:

 item.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (doViewsIntesect(dropTarget, v)) { Object data = v.getTag(DATA_KEY); //process data ((ViewGroup) v.getParent()).removeView(v); // to remove the item afterwards } } return false; } });