gpt4 book ai didi

android - 拖动 View 时设置自定义 anchor

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:49 24 4
gpt4 key购买 nike

我正在使用 Android Drag&Drop API 并尝试将拖动阴影的 anchor 设置为在 View 中进行触摸的位置。默认行为是将锚定在 View 的中间。

我做了一些研究,似乎这可以通过覆盖 onProvideShadowMetrics (Point shadowSize, Point shadowTouchPoint) 来完成DragShadowBuilder 类中的方法。据我了解,如果我更改 shadowTouchPoint 的 x,y 坐标,它应该会修改拖动 anchor 的坐标。

我所做的是像这样扩展 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);

到目前为止一切正常。但是当我测试应用程序并开始拖动过程​​时,拖动阴影位于触摸点下方的中心。所以它使用默认行为。我尝试调试,发现 mEventTouchXCoordmEventTouchYCoord 设置正确。 shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); 方法获得了正确的坐标,但它仍然使阴影居中。

我不知道我做错了什么。也许我误解了API。任何帮助或提示将不胜感激。

最佳答案

好的,正如 Scoup 所说,问题出在 onProvideShadowMetrics() 方法中。事实上,如果我删除 super 构造函数 super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);,它将不再显示拖动阴影。

仔细查看 API 方法,我发现了以下内容:

public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
final View view = mView.get();
if (view != null) {
shadowSize.set(view.getWidth(), view.getHeight());
shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
} else {
Log.e(View.VIEW_LOG_TAG, "Asked for drag thumb metrics but no view");
}
}

确实如此,它会将 shadowTouchPoint 重置到拖动的 View 的中间。但它也将拖动阴影初始化为正确的尺寸。虽然我希望正确设置拖动阴影尺寸,但我不想重置 shadowTouchPoint

实现此目的的最简单方法是在使用自定义值初始化shadowTouchPoint 之前调用 super 构造函数,如下所示:

@Override
public void onProvideShadowMetrics(Point shadowSize,
Point shadowTouchPoint) {

super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);

shadowTouchPoint.set(touchPointXCoord, touchPointYCoord);
}

另一种解决方案是自己处理拖动阴影 View 并完全跳过 super 构造函数。我会回来提供详细的更新。

关于android - 拖动 View 时设置自定义 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22458307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com