@Override public boolean onDrag(View view, DragEvent event) 如何获取绝对坐标
时间: 2024-01-13 13:02:26 浏览: 29
在 `View.OnDragListener` 的 `onDrag()` 方法中,可以通过 `event` 参数获取拖拽事件的相关信息,包括原始坐标和拖拽操作的状态等。要获取拖拽事件的绝对坐标,可以使用 `View` 的 `getGlobalVisibleRect()` 方法和 `DragEvent` 的 `getX()` 和 `getY()` 方法。具体操作如下:
1. 获取 `View` 的全局可见矩形。
```
Rect viewRect = new Rect();
view.getGlobalVisibleRect(viewRect);
```
2. 获取 `DragEvent` 的原始 X 和 Y 坐标。
```
float x = event.getX();
float y = event.getY();
```
3. 计算 `DragEvent` 的绝对坐标。
```
float absoluteX = viewRect.left + x;
float absoluteY = viewRect.top + y;
```
这样就可以获取 `View.OnDragListener` 中的 `DragEvent` 的绝对坐标了。注意,如果要在 `onDrag()` 方法中获取绝对坐标,需要确保 `View` 已经经过布局测量并显示在屏幕上,否则获取的坐标可能不准确。
相关问题
View.OnDragListener 的onDrag(View view, DragEvent event) 判断是否 事件在一个区域内
可以通过事件的坐标位置和区域的范围来判断。可以先获取事件的坐标位置,然后通过区域的 left、top、right、bottom 四个属性来判断事件是否在区域内。具体实现可以参考以下代码:
```
@Override
public boolean onDrag(View view, DragEvent event) {
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
// do something
return true;
case DragEvent.ACTION_DRAG_ENTERED:
// do something
return true;
case DragEvent.ACTION_DRAG_LOCATION:
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect(left, top, right, bottom);
if (rect.contains(x, y)) {
// event is in the specified area
}
return true;
case DragEvent.ACTION_DRAG_EXITED:
// do something
return true;
case DragEvent.ACTION_DROP:
// do something
return true;
case DragEvent.ACTION_DRAG_ENDED:
// do something
return true;
default:
break;
}
return false;
}
```
其中,left、top、right、bottom 是指定区域的范围,可以根据实际需求进行设置。在 ACTION_DRAG_LOCATION 的事件中,通过事件的 getX() 和 getY() 方法获取事件的坐标位置,然后通过 Rect 的 contains() 方法判断事件是否在指定区域内。
dragandrop将外部view拖拽进入recycleview示例代码
好的,以下是一个示例代码,演示如何将一个外部的View拖拽进入RecyclerView中:
```
// 创建一个View对象,设置LayoutParams,并将其添加到RecyclerView的父布局中
View view = new View(context);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
RecyclerView.LayoutParams.WRAP_CONTENT,
RecyclerView.LayoutParams.WRAP_CONTENT
);
layoutParams.setMargins(50, 50, 50, 50);
layoutManager.addView(view, layoutParams);
// 在RecyclerView的Item上设置setOnLongClickListener()监听器
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// 创建一个DragShadowBuilder对象和一个ClipData对象
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
ClipData data = ClipData.newPlainText("", "");
// 调用View.startDragAndDrop()方法来开始拖拽操作
v.startDragAndDrop(data, shadowBuilder, v, 0);
return true;
}
});
// 在onCreate()方法中重写onDragEvent()方法
@Override
public boolean onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取RecyclerView的父布局
ViewGroup parent = (ViewGroup) recyclerView.getParent();
// 重写onDragEvent()方法,将拖拽的View添加到RecyclerView中
parent.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
// 将拖拽的View添加到RecyclerView中
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
RecyclerView.LayoutParams.WRAP_CONTENT,
RecyclerView.LayoutParams.WRAP_CONTENT
);
int x = (int) event.getX();
int y = (int) event.getY();
View view = event.getLocalState();
layoutManager.addView(view, layoutParams);
// 拖拽结束,返回true
return true;
case DragEvent.ACTION_DRAG_ENDED:
// 从RecyclerView中移除拖拽的View
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
View view = event.getLocalState();
layoutManager.removeView(view);
// 拖拽结束,返回true
return true;
default:
break;
}
return false;
}
});
}
```
在这个示例代码中,我们创建了一个View对象,并将其添加到RecyclerView的父布局中。接着,我们在RecyclerView的Item上设置setOnLongClickListener()监听器,在其回调方法中创建一个DragShadowBuilder对象和一个ClipData对象,然后调用View.startDragAndDrop()方法来开始拖拽操作。
在重写的onDragEvent()方法中,我们判断传入的事件是否为拖拽事件。如果是,则根据事件的坐标和拖拽的View的LayoutParams来计算出View在RecyclerView中的位置,并将其添加到RecyclerView中。在拖拽结束时,我们需要将拖拽的View从RecyclerView中移除。