0

こんにちは、ユーザーが画面に触れたときにのみアクションを追加するように、Opencv の例を変更しました。コードにはツリークラスがあります。Activity を拡張する FdActivity、SurfaceView を拡張して SurfaceHolder.Callback を実装する FdViewBase、そして最後に FdViewBase を拡張する FdView です。

FdActivity の onCreate メソッド:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);            
        setContentView(new FdView(this));        
      }

FdViewBase のクラス コンストラクターには、メソッド呼び出し 'setFocusable(true);' があります。.
最後に onTouchEvent コード:

public boolean onTouchEvent(MotionEvent event) {                  
         //   if (event.getAction() == MotionEvent.ACTION_DOWN) 
              Log.i(TAG,"DOWN");                
            Log.i(TAG,"/\");
            return true;
        }

この方法では、コードでコンパイル エラーや実行エラーは発生しませんが、if ステートメントのコメントを外すと、次のエラー メッセージが表示されます。

04-16 21:59:06.011: I/OpenCV_NativeCamera(8952): ### Camera FPS ### [780] Frames, 12.84 FPS
    04-16 21:59:06.662: D/AndroidRuntime(8952): Shutting down VM
    04-16 21:59:06.662: W/dalvikvm(8952): threadid=1: thread exiting with uncaught exception (group=0x40018560)
    04-16 21:59:06.732: E/AndroidRuntime(8952): FATAL EXCEPTION: main
    04-16 21:59:06.732: E/AndroidRuntime(8952): java.lang.NullPointerException
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at org.opencv.samples.fd.FdActivity.onTouchEvent(Unknown Source)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.app.Activity.dispatchTouchEvent(Activity.java:2099)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1721)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1884)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.os.Handler.dispatchMessage(Handler.java:99)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.os.Looper.loop(Looper.java:130)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at android.app.ActivityThread.main(ActivityThread.java:3835)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at java.lang.reflect.Method.invokeNative(Native Method)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at java.lang.reflect.Method.invoke(Method.java:507)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
    04-16 21:59:06.732: E/AndroidRuntime(8952):     at dalvik.system.NativeStart.main(Native Method)
    04-16 21:59:07.432: I/OpenCV_NativeCamera(8952): ### Camera FPS ### [810] Frames, 21.09 FPS
    04-16 21:59:08.864: I/OpenCV_NativeCamera(8952): ### Camera FPS ### [840] Frames, 21.00 FPS
    04-16 21:59:12.588: I/OpenCV_NativeCamera(8952): ### Camera FPS ### [870] Frames, 8.04 FPS
    04-16 21:59:13.168: I/Process(8952): Sending signal. PID: 8952 SIG: 9

なぜそうなのかはわかりませんが、イベント ソースが表示されていないようです。

Eclipse は警告またはエラー メッセージを表示しませんでした。LogCat には他のエラーは表示されません。では、なぜそれが起こっているのか知っている人はいますか?

ありがとう=]

4

2 に答える 2

1
setContentView(new FdView(this)); 

上記のコードを以下のように置き換えます

View view = new FdView(this);
view.setOnTouchListener(this);
setContentView(view); 

これは、どのビューにも ontouch を設定していなかったためです。

于 2012-04-17T02:28:44.533 に答える
0

falseonTouchEvent() リスナーから戻ってみてください。

に戻るtrueと、イベントはそれ以上伝播されず、NPE を引き起こしている可能性があります。

于 2012-04-17T01:28:05.977 に答える