gpt4 book ai didi

android - 使用 ACTION_MOVE 拖动对象

转载 作者:行者123 更新时间:2023-11-29 01:44:41 24 4
gpt4 key购买 nike

我正在尝试让我绘制的所有 Sprites 都可以拖动到一个小游戏中。它应该能够触摸到任何地方, Sprite 应该移动相同的距离,手指移动。

使用以下方法,他们将在 ACTION_MOVE 事件上移动,但速度非常慢,距离更短,有时他们不会:addToX/Y 仅将间隙添加到 Sprite 的坐标

@Override
public boolean onTouchEvent(MotionEvent evt){
switch(evt.getAction()){
case MotionEvent.ACTION_DOWN:
break;

case MotionEvent.ACTION_MOVE:
if(getHistorySize() > 0){
for(int i = 1, n = evt.getHistorySize(); i < n; i++){
int calcX = (int) getHistoricalX(i) - (int) getHistoricalX(i-1);
int calcY = (int) getHistoricalY(i) - (int) getHistoricalY(i-1);
for(Sprite sprite : spriteList) {
sprite.addToX(calcX);
sprite.addToY(calcY);
}
}
}
return true;
}

对此有什么想法吗?

最佳答案

假设您的 Sprite 类是 android.view.View 的(可能是间接的)扩展,那么您可以使用 setOnDragListener()为它们定义一个 onDrag() 覆盖。然后您可以对它们使用 startDrag(...) 来开始拖动。这通常由在要拖动的 View 上的长按手势触发,但在您的情况下,您可以在 ACTION_MOVE 中从 onTouchEvent() 触发它一次(甚至 ACTION_DOWN)。参见 here有关这些方法的更多详细信息。

此外,关于您发布的代码,有一个问题可能解释了为什么它并不总是有效,那就是您只使用了历史点(这些点可能会或可能不会在对 onTouchEvent())。无论 getHistorySize() 是否大于 0,您仍然应该在每个上使用 evt.getX()evt.getY()调用 onTouchEvent()。但当然,如果您改用我建议的拖动监听器方法,则无需担心这一点。


根据评论更新

如果你想一次移动所有 Sprite ,你可以将 Sprite 放入全屏 FrameLayout 并附加一个使用 GestureDetector GestureDetector.SimpleOnGestureListener 捕获 onScroll() 回调,然后在 FrameLayout 上调用 scrollTo()。当父 FrameLayout 滚动时,它的所有子 sprite 看起来会一起移动。

关于android - 使用 ACTION_MOVE 拖动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217961/

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