1

我已经问过这个问题,但当时我认为 onTouch 事件之间的刷新时间是我的问题Android onTouch refresh rate。但事实并非如此。所以我的问题又来了:当我的手指触摸显示屏时,我需要一个精灵向左/向右/向上移动。所以我的 onTouchEvent 返回 true。但这只有在我的手指滑动一点或者触摸屏驱动程序太糟糕以至于它会抖动太多被检测为手指运动的情况下才有效。我用 Threads 提出了一个解决方案。所以我启动了一个正在移动播放器的线程,当手指抬起时它被中断。但也许有更好的方法来做到这一点?

@Override
public boolean onTouchEvent(MotionEvent me) {
    ...
if (me.getY() < getHeight() / 2) {
    return doAction(0);
} else if (me.getX() >= getWidth() / 2)
    return doAction(2);
else if (me.getX() < getWidth() / 2)
    return doAction(1);
//doAction returns TRUE
...

}

4

4 回答 4

1
    final Button b=(Button)findViewById(R.id.button1);

    b.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
              switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    b.setBackgroundResource(R.drawable.ic_launcher);    
                    finish();
                    return true;
                         case MotionEvent.ACTION_DOWN: 
                 //work u want to do etc ..use all the events like this 
}


        b.setBackgroundResource(R.drawable.ic_back);    
        return false;
        }
    });
于 2012-06-29T09:57:09.333 回答
1

好的,我用线程管理它。这是doAction的一部分。

if (event == MotionEvent.ACTION_DOWN) {
            movePlayer = new Thread() {
                public void run() {
                    while (!this.isInterrupted()) {
                        if (main.player.x > 5
                                && now.getLevel()[playerXsc][playerYsc] == Level.FLAG_SKY
                                && now.getLevel()[playerXsc][playerY2sc] == Level.FLAG_SKY) {
                            main.player.x -= 4;
                        } else if (main.player.x <= 5 && now instanceof L9)
                            main.player.x = aspectX * 19;
                        try {
                            Thread.sleep(5);
                        } catch (InterruptedException e) { break; }
                    }
                }
            };
            movePlayer.start();
        } else if (event == MotionEvent.ACTION_UP) {
            Log.e("ui", "mpt interrupt");
            movePlayer.interrupt();
        }
于 2012-06-29T10:06:00.180 回答
0

如果您的 doAction 方法不平凡,那么这将导致延迟,因为未来的触摸事件将“缓冲”等待来自此 onTouchEvent 处理程序的响应。另外,你在使用

runOnUiThread(new Runnable() {
    public void run() { 
       // Changes to UI here...
    }
});

更多信息:Activity.runOnUIThread

于 2012-06-29T08:40:38.957 回答
0
WebView1 = (WebView) findViewById(R.id.StudyWebview);   
detector = new GestureDetector(this, this); 
WebView1.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            detector.onTouchEvent(event);
            return true;
        }
    });

请实现 OnGestureListener 并使用它的回调方法

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float arg3) {
    float dX = e2.getX() - e1.getX();
    float dY = e1.getY() - e2.getY();
    // check is all completed or return with some condition
    if (Math.abs(dY) < SWIPE_MAX_OFF_PATH && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY && Math.abs(dX) >= SWIPE_MIN_DISTANCE) {
        // logic for left and right
        if (dX < 0) {

        }

        else if (dX > 0) {

        }
    }

    return true;
}

@Override
public void onLongPress(MotionEvent arg0) {

}

@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {

    return false;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onSingleTapUp(MotionEvent e) {

    return false;
}
于 2012-06-29T09:39:56.097 回答