1

我正在努力实现一个锁屏,就像三星 Galaxy 3 的水波纹锁屏一样。我已经完成了 GLSurfaceView 对象。但是当我将它移植到锁定屏幕时出现问题。SurfaceView 无法在窗口类型为 TYPE_KEYGUARD 的锁定屏幕上显示。如果我对这个SurfaceView使用setZOrderOnTop(true),它是可以显示的,但是它会覆盖Lock Screen的所有其他层,这不是我的预期。此 SurfaceView 在正常应用程序中可以正常显示。我使用“adb shell dumpsys SurfaceFlinger”来转储图层信息。它的 visibleRegionScreen 就是这样,Region visibleRegionScreen (this=0x15841a0, count=1) [ 0, 0, 0, 0]

任何人都知道如何解决此问题并在锁定屏幕上显示 SurfaceView?非常感谢。

4

2 回答 2

0

你对 setZOrderOnTop(true) 调用是正确的,但我不太明白你的问题。您只在整个屏幕上看到 SurfaceView?在这种情况下,只需在锁屏布局 xml 中放置一个 LinearLayout 并将您的 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);
于 2012-12-13T18:55:12.583 回答
0

我很感激你的评论。附上我的实现供您参考。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"/>

在 LockScreen.java 构造函数上添加 GLSurfaceViewn:

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);
于 2012-12-15T04:20:05.460 回答