Как показать SurfaceView на экране блокировки?

Я работаю над созданием экрана блокировки, точно такого же, как экран блокировки воды Samsung Galaxy 3. Я закончил объект GLSurfaceView. Но есть проблема, когда я портирую его на экран блокировки. SurfaceView не может отображаться на экране блокировки с типом окна TYPE_KEYGUARD. Если я использую setZOrderOnTop(true) для этого SurfaceView, его можно отобразить, но он будет перекрывать все остальные слои экрана блокировки, чего я не ожидал. Этот SurfaceView может нормально отображаться в обычном приложении. Я использовал «adb shell dumpsys SurfaceFlinger» для вывода информации о слоях. Его visibleRegionScreen выглядит так: Region visibleRegionScreen (this=0x15841a0, count=1) [0, 0, 0, 0]

Кто-нибудь знает, как решить эту проблему и отобразить SurfaceView на экране блокировки? Большое спасибо.


person user1891056    schedule 10.12.2012    source источник


Ответы (2)


Вы правы насчет вызова setZOrderOnTop(true), но я не очень понимаю ваш вопрос. Вы видите только SurfaceView на весь экран? В этом случае просто поместите LinearLayout в XML макет экрана блокировки и добавьте к нему свой Surfaceview.

В keyguard_screen_tab_unlock.xml после представления цифровых часов поместите:

<LinearLayout
        android:id="@+id/dummyGLLayout"
        android:orientation="vertical"
        android:layout_width="match_parent"
         android:layout_height="wrap_content"
        android:gravity="top">
</LinearLayout>

В конструкторе LockScreen.java:

GLSurfaceView mySurfaceView
mySurfaceView = new MySurfaceViewClass(mContext);
LinearLayout ll = (LinearLayout) findViewById(R.id.dummyGLLayout);
mySurfaceView.setZOrderOnTop(true);
ll.addView(mySurfaceView);
person ola1olsson    schedule 13.12.2012
comment
Привет ola1olsson, Спасибо за ваш ответ. Но ваше решение не работает для моей проблемы. SurfaceView по-прежнему отображается на весь экран с setZOrderOnTop(true). - person user1891056; 15.12.2012
comment
Немного удивительно, так как я сам сделал это на устройстве AOSP. Я вернусь с разницей кода, когда у меня будет такая возможность. - person ola1olsson; 16.12.2012

Я признателен за ваш комментарий. Прикрепите мою реализацию для справки. GLSurfaceView не отображался на экране блокировки. Мой макет таков:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_lockscreen_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<FrameLayout
    android:id="@+id/my_lockscreen_clock"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true" 
    android:visibility="gone"/>

Добавьте конструктор GLSurfaceViewn в LockScreen.java:

RelativeLayout mRootLayout = (RelativeLayout) findViewById(R.id.my_lockscreen_root);
View myGLSurfaceView = new MyGLSurfaceView(mContext, mCallback);
FrameLayout.LayoutParams layoutparams = 
   new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mRootLayout.addView(mUnlockWidget, 0, layoutparams);
person user1891056    schedule 15.12.2012