0

アニメーション/ゲーム/... に使用される surfaceView クラスがある場合、同じクラスに onTouchEvent() メソッドと描画/画面更新メソッドがあります。ここで、onTouchEvent メソッドをスリープさせたいので、1 秒間に +-80 回呼び出されて CPU があふれないようにします (したがって、遅延が発生します)。問題は、このクラスをスリープ状態にすると、描画も停止することです。

**Edit88 onTouchEvent() が頻繁に呼び出されるのを止めようとしています。私の試み:

@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("firstTest",Integer.toString(event.getAction()));   //shows up
if (!sleeper.CurrentlySleeping) {
    Log.d("2ndTest",Integer.toString(event.getAction())); //not showing up
    ~~  some calculations and stuff  ~~

.

public class TouchSleeper extends Thread {
// If Thread is sleeping or not.
public static Boolean CurrentlySleeping;
public TouchSleeper() {
CurrentlySleeping = false;
this.setPriority(MIN_PRIORITY);
}

@Override
public void run() {
try {
    while (true) {
        CurrentlySleeping = true;
        TouchSleeper.sleep(50);
        CurrentlySleeping = false; }
    ~end~

まず、SurfaceView クラスのコードです。ブール値を変更し続けるクラス/スレッドの 2 番目の部分。最初の Log.d は何かを返し、2 番目の Log.d は返さないことに注意してください。これは、CurrentlySleeping が決して false ではないことを示しています。私はまだ物事を理解していない...?

4

2 に答える 2

1

onTouch イベントが発生したときに処理コードをブロックするのではなく、最初に onTouch イベントをリッスンしない方が簡単だと思います。この場合、呼び出される関数のオーバーヘッドが残ります (この場合はしたくないとき)

onTouchListenerそのため、インターフェイスを実装し、を使用してビューに設定しsetOnTouchListenerます。ビューの onTouch イベントをリッスンしたくない場合は、NULL に設定します。

スリープを使用する代わりに、Alarm を使用するか、遅延メッセージをスレッド ハンドラーに投稿してonTouchListener、後でビューの をリセットしてみてください。(個人的には、寝るよりずっとすっきりしていると思います :) )

于 2011-06-16T18:46:13.197 に答える
0

クラスに onTouchEvent メソッドがある場合、それが呼び出されるのを防ぐことはできません。onTouchEvent が false を返すようにするだけで、他には何もしません。

于 2011-06-16T18:45:53.667 に答える