当手指触摸屏幕时,SurfaceView执行方法

时间:2014-02-11 16:58:58

标签: android surfaceview ontouchevent

这很可能是一件微不足道的事情,但我无法找到解决方案。 事情很简单,用户按下屏幕,当他将手指放在屏幕上时,我想要一段代码来执行。

以下是代码示例:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (getHolder()) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        myobject.setX(myobject.getX() - 10);
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
            }
            return true;
        }
    }

这段代码的效果是myobject.setX()只发生一次,我希望它在用户将手指放在屏幕上时不断重复,所以如果它保持3秒钟,myobject.setX()会几次减少-10次。

3 个答案:

答案 0 :(得分:1)

您可以使用布尔变量(在ACTION_DOWN上指定为true)来指示您仍然按下屏幕,当您举起手指(ACTION_UP)时,将其设置为false,因此在此期间您可以启动一个Thread在你想要的时间执行你的代码,如下所示:

private boolean mIsStillPressing;

@Override
public boolean onTouchEvent(MotionEvent event) {
    synchronized (getHolder()) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mIsStillPressing = true;
            new Thread() {
                @Override
                public void run() {
                    // Still moving object until an ACTION_UP is done.
                    while (mIsStillPressing) {
                        myobject.setX(myobject.getX() - 10);

                        // Some sleep time
                        try {
                            Thread.sleep(100L);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            mIsStillPressing = false;
        }
        return true;
    }
}`

答案 1 :(得分:0)

public boolean onTouchEvent(MotionEvent event)中提供的MotionEvent仅与初始触摸的MotionEvent.ACTION_DOWN匹配。您需要在else if语句中继续更新:(event.getAction() == MotionEvent.ACTION_MOVE)

答案 2 :(得分:0)

你可以这样做(例子):

int howLongUntilEdge = 1000;
CountDownTimer t = new CountDownTimer(howLongUntilEdge, 1000) {

    @Override
    public void onTick(long millisUntilFinished) {
        myobject.setX(myobject.getX() - 10);
    }

    @Override
    public void onFinish() {}
};

然后是你的触摸事件:

@Override
public boolean onTouchEvent(MotionEvent event) {
    synchronized (getHolder()) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            t.start();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            t.stop();
        }

        return true;
    }
}

它会每秒向左移动10。您需要做一些事情,比如决定它到达边缘的秒数,并设置howLongUntilEdge var以反映正确的值