onTouchEvent按住,连续执行

时间:2015-02-23 03:38:50

标签: android touch

在我的onTouchEvent()方法中,我想执行一个继续重复的动作,直到我将手指从屏幕上抬起。这是我的代码:

public void onTouchEvent(MotionEvent event) {
    synchronized (this) {
        Matrix matrix = new Matrix();

        float x = event.getX();
        if (x >= screenWidth / 2) {
            rotate += 10;
        } else {
            rotate -= 10;
        }
        matrix.postRotate(rotate, square.getWidth() / 2, square.getHeight() / 2);
        position.set(matrix);
        position.postTranslate(xPos, yPos);
    }
    return true;
}

但问题是,如果我按住我的手指而不动它,动作只会执行一次。我尝试了各种解决方案,包括

boolean actionUpFlag = false;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
    actionUpFlag = true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
    actionUpFlag = false;
}

while (actionUpFlag) {
    //the block of code above        
}

并且仅在事件为MotionEvent.ACTION_MOVE时执行操作,并在onTouchEvent()结尾处返回false,所有这些都不成功。谁能告诉我错误是什么?

MotionEvent.ACTION_MOVE尝试的代码块:

if (event.getAction() == MotionEvent.ACTION_MOVE) {
    //block of code above
}

1 个答案:

答案 0 :(得分:1)

您是否考虑使用Thread来完成此操作?

现在已经很晚了(我已经工作了13个小时),但这应该给你一个要点:

WorkerThread workerThread;

public void onTouchEvent(MotionEvent event){


    int action = event.getAction();

    switch(action){
        case MotionEvent.ACTION_DOWN:
            if (workerThread == null){
                workerThread = new WorkerThread();
                workerThread.start();
            }
            break;
        case MotionEvent.ACTION_UP:
            if (workerThread != null){
                workerThread.stop();
                workerThread = null;
            }
            break;
        }
    return false;
}

您的Thread实施可能是一个内部类,如:

class WorkerThread extends Thread{

    private volatile boolean stopped = false;

    @Override
    public void run(){
        super.run();
        while(!stopped){
            //do your work here
        }   
    }

    public void stop(){
        stopped = true;
    }
}

除非您想执行其他操作,否则您可能只想忽略MotionEvent.ACTION_MOVE

如果要使用WorkerThread更新UI,请确保以线程安全的方式执行此操作。

Here is a link to the Android API Guide on Processes and Threads