我有两个ImageView
- 一个固定在一个位置
- 第二,我需要应用拖放功能。
我需要的:
将第二个拖到ImageView
另一个ImageView
,当它们相交时,我需要调用一个方法。
编辑1:
相交 b/w 两个 imageViewDONE
但在拖放时它没有发生。
编辑 2:
我怎样才能实现这件事Drag and drop
?
我假设您需要 Android 的此功能。最简单的方法是使用 Rect 类中的 intersects 方法。链接到文档。
import android.graphics.Rect;
...
Rect rc1 = new Rect();
imageView1.getDrawingRect(rc1);
Rect rc2 = new Rect();
imageView2.getDrawingRect(rc2);
if (Rect.intersects(rc1, rc2)) {
// intersection is detected
// here is your method call
}
*编辑添加缺少的右括号
这是我的有效解决方案
private boolean isViewOverlapping(View firstView, View secondView) {
final int[] location = new int[2];
firstView.getLocationInWindow(location);
Rect rect1 = new Rect(location[0], location[1],location[0] + firstView.getWidth(), location[1] + firstView.getHeight());
secondView.getLocationInWindow(location);
Rect rect2 = new Rect(location[0], location[1],location[0] + secondView.getWidth(), location[1] + secondView.getHeight());
return rect1.intersect(rect2);
// return (rect1.contains(rect2)) || (rect2.contains(rect1));
}
调用上面的函数
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
if(isViewOverlapping(view,child))
{Toast.makeText(this,"Overlapping with "+child.getTag() or text ,Toast.LENGTH_SHORT).show();
}
希望这可以帮助
@override
onWindowFocusChanged(boolean focus)
并将您的代码放在那里 cz onCreate()/onStart() - 这不起作用
您是否已经为第二个创建了拖放功能ImageView
?
如果是这样,您需要做的就是调用getLeft()、getRight() 等以在拖动后(或在拖动时每隔几个增量在 Handler 上)找到第二个视图的位置,然后这变得很简单矩形相交问题,这里已经有了答案。
迟到的回复,但我也遇到了这个问题,并用以下代码修复了它。Action drop的解决方法在这里已经回答了,所以我不再发了。但是如果你想在拖动时检测它,你必须在里面做这些事情DragEvent.ACTION_DRAG_LOCATION
。
获取当前拖动事件的 xy:
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
现在计算矩形的大小。为此(在我的情况下)如果必须划分视图的大小,因为拖动位置在它的中心,然后计算上/左/右/下:
int left = (int) (x_cord - halfViewSize);
int top = (int) (y_cord - halfViewSize);
int right = (int) (x_cord + halfVaieSize);
int bottom = (int) (y_cord + halfViewSize);
我选择了这个值,因为在我的例子中,halfViewSize 是一个float
. 如果您有integer
,则无需强制转换。
现在您可以使用这些值构建一个矩形:
Rect rect = new Rect(left, top, right, bottom);
创建一个方法来检查矩形是否与您的 childViews 的矩形相交:
private boolean collideWithOthers(Rect rect) {
int count = yourParentLayout.getChildCount();
boolean intersects = false;
for (int i = 0; i < count; i++) {
ImageView squareInside = (ImageView) yourParentLayout.getChildAt(i);
Rect rectInside = squareInside.getCollisionRect();
if (rectInside.intersect(rect)) {
Log.d("TAG", "ATTENTION INTERSECT!!!");
intersects = true;
break;//stop the loop because an intersection is detected
}
}
return intersects;
}
现在你可以在里面做这些事情 ACTION_DRAG_LOCATION
:
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
int left = (int) (x_cord - halfViewSize);
int top = (int) (y_cord - halfViewSize);
int right = (int) (x_cord + halfVaieSize);
int bottom = (int) (y_cord + halfViewSize);
Rect rect = new Rect(left, top, right, bottom);
boolean collide = collideWithOthers(rect);
我希望这能满足您的需求,如果不是,也许对其他人有帮助。