Обработка событий в SurfaceView - PullRequest
2 голосов
/ 10 июня 2009

Я создаю собственный виджет, который расширяет 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?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 24 ноября 2009

OnKeyListener для определенного View будет вызываться только в том случае, если клавиша нажата, когда у View есть фокус. Для того, чтобы универсальный SurfaceView был сфокусирован, сначала он должен быть сфокусированным:

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

И чем вы можете сфокусировать вид, позвонив по номеру requestFocus():

videoPreview.requestFocus();

После этого ваш OnKeyListener начнет получать ключевые события, пока какой-то другой вид не окажется в фокусе.

1 голос
/ 11 июня 2009

Я не уверен, что это ответ, который вы ищете, но, возможно, стоит попробовать.

OnKeyListener для определенного вида будет вызываться только в том случае, если клавиша нажата, когда этот вид имеет фокус. Вы можете попытаться убедиться, что он имеет фокус с:

videoPreview.requestFocus();

или поместите OnKeyListener на макет (например, LinearLayout), который содержит все остальное (включая CaptureView). Что-то вроде:

LinearLayout ll = (LinearLayout) findViewById(R.id.VideoContainer);
ll.setOnClickListener(new OnKeyListener(){
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // ...
    }
);
0 голосов
/ 12 июня 2009

Поскольку кажется, что у вас есть собственная настройка класса с именем «CaptureView», вы также можете переопределить View.onKeyDown и View.onKeyUp в своем классе «CaptureView». Это всегда работало в моих играх на основе SurfaceView и позволяет вам выполнять любую дополнительную обработку, которую вы, возможно, захотите делать в промежутке между событиями down и up.

View.onKeyDown ()

...