【问题标题】:Java Android onTouch DirectionJava Android onTouch 方向
【发布时间】:2016-06-18 21:02:06
【问题描述】:

我正在尝试开发一个需要投掷子弹的简单游戏。 我希望球跟随触摸或滑动方向。

但是,我有一个小问题没有成功解决。

我在MotionEvent 的ACTION_DOWN 上取坐标,在MotionEvent 的ACTION_UP 上取坐标,然后计算直线方程,以便球按照这条直线移动。

问题在于,当我向接近“向上”或“向前”或“在前面”的方向滑动时,球会以闪电般的速度移动,而在另一个更倾斜(向右或向左)或对角线的方向上,球以正常速度运动。

我的计算缺陷在哪里?

请帮帮我,我离结果不远,但需要你来解决这个问题!

onTouch 方法:

public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
        case(MotionEvent.ACTION_DOWN):
            balle.setX(event.getX());
            balle.setY(event.getY());
            ya = event.getY();
            xa = event.getX();
            break;

        case(MotionEvent.ACTION_UP):
            xb = event.getX();
            yb = event.getY();
            balle.setMove(true);
            break;
    }

    return true;
}

这是我的moveDirection 方法:

public void moveDirection(float xa, float ya, float xb, float yb) {
    if(!move) {
        return;
    }
    else {
        float m, b;
        float dx = xb-xa;

        m = (yb - ya) / (xb - xa);

        b = ya - (m * xa);

        if(dx > 0) {
            this.x += speedX;
        }
        else {
            this.x += -speedX;
        }

        this.y = (m * this.x + b);
    }
}

提前谢谢你!

【问题讨论】:

  • 当你向右或向左移动时,这些事件都不会被调度,所以可能你正在失去一些交互(这可能会导致速度降低),尝试在这种情况下添加一个默认选项,抱歉没有帮助更多,但我对android中的游戏知之甚少:)
  • 我必须在哪里添加选项 right 或 left ?在 moveDirection 函数中还是在 onTouch 函数中?
  • 在 onTouch 中,您正在捕获上下运动,如果您在案例中添加默认选项,则可以捕获其他触摸事件。您可以添加一个 VelocityTracker 来确定事件的速度,我将发布带有示例的代码

标签: java android swipe ontouch


【解决方案1】:

我看到您没有捕获所有事件,因此,也许 Android 文档中带有 de VelocityTracker api 的代码可能会有所帮助,在此示例中,当您拉下手指时,会创建一个新的跟踪器,并且当您移动时(在任何方向)你捕捉到事件的速度,我认为你可以根据触摸的速度和方向移动球。

public class MainActivity extends Activity {
private static final String DEBUG_TAG = "Velocity";
    ...
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
    int index = event.getActionIndex();
    int action = event.getActionMasked();
    int pointerId = event.getPointerId(index);

    switch(action) {
        case MotionEvent.ACTION_DOWN:
            if(mVelocityTracker == null) {
                // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                mVelocityTracker = VelocityTracker.obtain();
            }
            else {
                // Reset the velocity tracker back to its initial state.
                mVelocityTracker.clear();
            }
            // Add a user's movement to the tracker.
            mVelocityTracker.addMovement(event);
            break;
        case MotionEvent.ACTION_MOVE:
            mVelocityTracker.addMovement(event);
            // When you want to determine the velocity, call 
            // computeCurrentVelocity(). Then call getXVelocity() 
            // and getYVelocity() to retrieve the velocity for each pointer ID. 
            mVelocityTracker.computeCurrentVelocity(1000);
            // Log velocity of pixels per second
            // Best practice to use VelocityTrackerCompat where possible.
            Log.d("", "X velocity: " + 
                    VelocityTrackerCompat.getXVelocity(mVelocityTracker, 
                    pointerId));
            Log.d("", "Y velocity: " + 
                    VelocityTrackerCompat.getYVelocity(mVelocityTracker,
                    pointerId));
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            // Return a VelocityTracker object back to be re-used by others.
            mVelocityTracker.recycle();
            break;
    }
    return true;
}
}

doc 的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多