【问题标题】:How to pause a moving object in android如何在android中暂停移动的对象
【发布时间】:2011-12-07 07:16:03
【问题描述】:

我正在开发一款安卓游戏。在此我在屏幕上有两个动态图像,可以拖动这些图像,但我的进一步要求是在我触摸图像时暂停图像。我没有找到任何暂停图像的事件,而是在图像暂停的相同位置重新开始移动。

任何人都可以告诉我解决方案。 谢谢。

我正在使用 onTouch 来拖动和移动图像。

public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Parcelable state=null;
            // delegating event handling to the droid
            droid1.handleActionDown((int)event.getX(), (int)event.getY());
            droid2.handleActionDown((int)event.getX(), (int)event.getY());
            // check if in the lower part of the screen we exit
            if (event.getY() > getHeight() - 50) {

                thread.setRunning(false);
                ((Activity)getContext()).finish();
            } else {
                Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());

            }
        } if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // the gestures
            if (droid1.isTouched()) {
                // the droid was picked up and is being dragged
                droid1.setX((int)event.getX());
                droid1.setY((int)event.getY());

            }
            if (droid2.isTouched()) {
                // the droid was picked up and is being dragged
                droid2.setX((int)event.getX());
                droid2.setY((int)event.getY());
            }

        } if (event.getAction() == MotionEvent.ACTION_UP ) {
            // touch was released
            if (droid1.isTouched()) {
                droid1.setTouched(false);
            }
            if (droid2.isTouched()) {
                droid2.setTouched(false);
            }
        }


        return true;
    }

【问题讨论】:

标签: android multithreading android-gesture android-event


【解决方案1】:

根据您的代码和评论中的链接,需要更改一些内容才能实现您的目标。首先,您需要能够区分单击和拖动移动。前者将“暂停”图像/机器人,而后者将允许您拖动它。

解决此问题的一种方法是保留一个决定操作的标志。像这样的:

private boolean mIsDragging = false;

public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // delegating event handling to the droid
        droid1.handleActionDown((int)event.getX(), (int)event.getY());
        droid2.handleActionDown((int)event.getX(), (int)event.getY());
        ...
        mIsDragging = false;
    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (droid1.isTouched()) {
            // the droid was picked up and is being dragged
            droid1.setX((int)event.getX());
            droid1.setY((int)event.getY());
        }
        if (droid2.isTouched()) {
            // the droid was picked up and is being dragged
            droid2.setX((int)event.getX());
            droid2.setY((int)event.getY());
        }
        mIsDragging = true;  
    } if (event.getAction() == MotionEvent.ACTION_UP ) {
        if (!mIsDragging) {
            // Not dragging means a 'click', thus toggle pausing
            if (droid1.isTouched()) {
                droid1.setPaused(!droid1.isPaused());
            }
            if (droid2.isTouched()) {
                droid2.setPaused(!droid2.isPaused());
            }
        }
        // Always reset on up action
        if (droid1.isTouched()) {
            droid1.setTouched(false);
        }
        if (droid2.isTouched()) {
            droid2.setTouched(false);
        }
        mIsDragging = false;
    }
    return true;
}

要真正停止图像/机器人的移动,您应该添加一些方法将水平和垂直方向的速度设置为“0”。或者,您可以设置一个标志来指示您是否要更新位置。

根据您采用的方法,您可能还必须更改更新逻辑以考虑“暂停”状态。如果您只是选择将速度设置为 (0,0),那么您可能无需执行任何操作,因为位移会导致两个方向的位移均为“0”。

在代码 sn-p 中,我假设有一个 setPause(boolean) 和 isPaused() 方法。这些应该直接作用于标志或速度值。

例如,使用标志:

private boolean mIsPaused = false;

public void setPaused(boolean pause) {
    mIsPaused = pause;
}

public boolean getPaused() {
    return mIsPaused;
}

...

public void update() {
    // Only update if we're not dragging and not 'paused'
    if (!touched && !mIsPaused) {
        x += (speed.getXv() * speed.getxDirection());
        y += (speed.getYv() * speed.getyDirection());
    }
}

或者直接使用速度值:

private Speed mSpeed = new Speed(1,1);

public void setPaused(boolean pause) {
    pause ? mSpeed.setSpeed(0,0) : mSpeed.setSpeed(1,1);
}

public boolean getPaused() {
    return mSpeed.getX() == 0 && mSpeed.getY() == 0;
}

...

public void update() {
    // No change necessary as multiplying by '0' results in a zero displacement
}

请注意,我没有测试任何代码,也不是一个完整的示例。

【讨论】:

  • 谢谢 :),在 ltl 更改后,它对两个 droid 工作得很好,现在我必须在一段时间内制作 num 个 droid。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多