【发布时间】:2014-04-22 21:22:54
【问题描述】:
我正在使用 Android Drag&Drop API 并尝试将拖动阴影的锚点设置为在 View 中进行触摸的点。默认行为是将锚点放在View 的中间。
我做了一些研究,似乎这可以通过覆盖DragShadowBuilder 类中的onProvideShadowMetrics (Point shadowSize, Point shadowTouchPoint) 方法来完成。据我了解,如果我更改 shadowTouchPoint 的 x,y 坐标,它应该会修改拖动锚点的坐标。
我所做的是像这样扩展DragShadowBuilder 类:
class EventDragShadowBuilder extends DragShadowBuilder {
int touchPointXCoord, touchPointYCoord;
public EventDragShadowBuilder() {
super();
}
public EventDragShadowBuilder(View view, int touchPointXCoord,
int touchPointYCoord) {
super(view);
this.touchPointXCoord = touchPointXCoord;
this.touchPointYCoord = touchPointYCoord;
}
@Override
public void onProvideShadowMetrics(Point shadowSize,
Point shadowTouchPoint) {
shadowTouchPoint.set(touchPointXCoord, touchPointYCoord);
super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
}
}
在我使用拖放的Fragment 中,我创建了两个侦听器来为View 启动拖动事件:
mEventLongClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
EventDragShadowBuilder shadowBuilder = new EventDragShadowBuilder(
view, mEventTouchXCoord, mEventTouchYCoord);
view.startDrag(null, shadowBuilder, view, 0);
return true;
}
};
// We need this listener in order to get the corect coordinates for the
// drag shadow
mEventTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
mEventTouchXCoord = (int) event.getX();
mEventTouchYCoord = (int) event.getY();
break;
}
}
return false;
}
};
我设置了两个监听器:
itemView.setOnLongClickListener(mEventLongClickListener);
itemView.setOnTouchListener(mEventTouchListener);
到这里为止一切正常。但是当我测试应用程序并开始拖动过程时,拖动阴影在触摸点下方居中。所以它使用默认行为。我尝试调试,发现mEventTouchXCoord 和mEventTouchYCoord 设置正确。 shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); 方法获得了正确的坐标,但它仍然使阴影居中。
我不知道我做错了什么。也许我误解了 API。任何帮助或提示将不胜感激。
【问题讨论】:
标签: android drag-and-drop