2

SurfaceView を拡張するカスタム ウィジェットを作成しており、それをカメラ プレビューに使用する予定です。

メイン アクティビティで、いくつかのイベント リスナーを実装しようとしましたが、イベントをキャッチできません。

これは、イベント リスナーを追加しようとしたコードの一部です。

videoPreview = (CaptureView)findViewById(R.id.capturePreview);

    videoPreview.setOnKeyListener(new OnKeyListener(){
        public boolean onKey(View v, int keyCode, KeyEvent event){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_CAMERA:
                videoPreview.TakePicture();
                return true;
            }
            return false;
        }
    });

ボタンを押すと、LogCat は「キーがディスパッチされるのを待ち続けています」という行を出力します。

SurfaceView クラスを使用してメイン アクティビティにイベント リスナーを実装する方法を知っている人はいますか?

ありがとう!

4

3 に答える 3

3

OnKeyListener特定のforは、フォーカスViewがあるときにキーが押された場合にのみ呼び出されます。ViewジェネリックSurfaceViewをフォーカスするには、最初にフォーカス可能である必要があります。

view.setFocusable(true);
view.setFocusableInTouchMode(true);

そして、あなたが呼び出すことによってビューを集中させることができるよりもrequestFocus()

videoPreview.requestFocus();

その後、OnKeyListener他のビューにフォーカスが移るまで、重要なイベントの受信を開始します。

于 2009-11-24T15:02:06.610 に答える
1

これがあなたが探している答えかどうかはわかりませんが、試してみる価値があるかもしれません。

特定のビューのOnKeyListenerは、そのビューにフォーカスがあるときにキーが押された場合にのみ呼び出されます。次の方法でフォーカスがあることを確認できます。

videoPreview.requestFocus();

または、他のすべて ( を含む) を含むOnKeyListenerレイアウト (例: ) に を配置します。何かのようなもの:LinearLayoutCaptureView

LinearLayout ll = (LinearLayout) findViewById(R.id.VideoContainer);
ll.setOnClickListener(new OnKeyListener(){
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // ...
    }
);
于 2009-06-10T22:44:57.587 に答える
0

「CaptureView」という名前の独自のカスタム クラス設定があるように見えるので、「CaptureView」クラスで View.onKeyDown と View.onKeyUp をオーバーライドすることもできます。これは、私の SurfaceView ベースのゲームでは常に機能しており、ダウン イベントとアップ イベントの間の時間に必要な追加処理を行うことができます。

View.onKeyDown()

于 2009-06-11T21:39:32.960 に答える