当我调用 setZOderOnTop(true) 时,surfaceview 消失了
surfaceview disappears when i call setZOderOnTop(true)
我有自定义的表面视图,我想叠加在其他视图上。
所以我尝试了以下答案。
how to make surfaceview transparent
当我在我的自定义表面视图上调用 setZOderOnTop(true) 时,它很快就会覆盖其他视图。但是surfaceview过一会就消失了
当我 on/off 我的 android 设备时,surfaceview 也会很快出现。
我不知道它为什么会消失。请帮助我!
有我主要的 activity 的 onCreate
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
int sample_id=R.drawable.d7d;
piece_size=105;
sample= BitmapFactory.decodeResource(this.getResources(),
sample_id);
int returnv[] = centercrop(sample.getWidth(),sample.getHeight());
int ncols=returnv[0]/piece_size;
int nrows=returnv[1]/piece_size;
returnv[0]=ncols*piece_size;
returnv[1]=nrows*piece_size;
sample=getResizedBitmap(sample,returnv[0],returnv[1]);
Bundle config = ExampleJigsawConfigurations.customsettings(returnv[0],returnv[1],ncols,nrows,returnv[0],returnv[1],sample,sample_id,piece_size);
puzzleSurface = new PuzzleCompactSurface(this,config);
JigsawPuzzle jigsawPuzzle = new JigsawPuzzle(this, config);
puzzleSurface.setPuzzle(jigsawPuzzle);
setContentView(R.layout.puzzle_layout);
RelativeLayout surfaceView=(RelativeLayout)findViewById(R.id.surfaceframe);
surfaceView.addView(puzzleSurface);
}
布局Xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:clipToPadding="false">
<include
android:id="@+id/toolbar2"
layout="@layout/toolbar2" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_weight="1"
android:background="#F7F1EB"
android:clipToPadding="false">
<FrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/surfaceframe"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</FrameLayout>
</LinearLayout>
</LinearLayout>
自定义表面视图
public PuzzleCompactSurface(Context context,Bundle config) {
super(context);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
getHolder().addCallback(this);
gameThread = new PuzzleThread(getHolder(), context, this);
this.config=config;
MAX_PUZZLE_PIECE_SIZE= config.getBundle("board").getInt("pieceSize");
CLIP=Math.round((float) 10 / 64 * MAX_PUZZLE_PIECE_SIZE);
setFocusable(true);
setZOrderOnTop(true);
}
我自己解决了。消失的表面视图问题是因为导航栏。
我认为导航栏位于我的自定义 surfaceview 的顶部,导致 surfaceview 隐藏。
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
uiOptions =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
通过将此代码放在主 activity 上,surfaceview 可以很好地覆盖。但是我不能使用导航栏。
我有自定义的表面视图,我想叠加在其他视图上。
所以我尝试了以下答案。 how to make surfaceview transparent
当我在我的自定义表面视图上调用 setZOderOnTop(true) 时,它很快就会覆盖其他视图。但是surfaceview过一会就消失了
当我 on/off 我的 android 设备时,surfaceview 也会很快出现。
我不知道它为什么会消失。请帮助我!
有我主要的 activity 的 onCreate
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
int sample_id=R.drawable.d7d;
piece_size=105;
sample= BitmapFactory.decodeResource(this.getResources(),
sample_id);
int returnv[] = centercrop(sample.getWidth(),sample.getHeight());
int ncols=returnv[0]/piece_size;
int nrows=returnv[1]/piece_size;
returnv[0]=ncols*piece_size;
returnv[1]=nrows*piece_size;
sample=getResizedBitmap(sample,returnv[0],returnv[1]);
Bundle config = ExampleJigsawConfigurations.customsettings(returnv[0],returnv[1],ncols,nrows,returnv[0],returnv[1],sample,sample_id,piece_size);
puzzleSurface = new PuzzleCompactSurface(this,config);
JigsawPuzzle jigsawPuzzle = new JigsawPuzzle(this, config);
puzzleSurface.setPuzzle(jigsawPuzzle);
setContentView(R.layout.puzzle_layout);
RelativeLayout surfaceView=(RelativeLayout)findViewById(R.id.surfaceframe);
surfaceView.addView(puzzleSurface);
}
布局Xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:clipToPadding="false">
<include
android:id="@+id/toolbar2"
layout="@layout/toolbar2" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_weight="1"
android:background="#F7F1EB"
android:clipToPadding="false">
<FrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/surfaceframe"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</FrameLayout>
</LinearLayout>
</LinearLayout>
自定义表面视图
public PuzzleCompactSurface(Context context,Bundle config) {
super(context);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
getHolder().addCallback(this);
gameThread = new PuzzleThread(getHolder(), context, this);
this.config=config;
MAX_PUZZLE_PIECE_SIZE= config.getBundle("board").getInt("pieceSize");
CLIP=Math.round((float) 10 / 64 * MAX_PUZZLE_PIECE_SIZE);
setFocusable(true);
setZOrderOnTop(true);
}
我自己解决了。消失的表面视图问题是因为导航栏。
我认为导航栏位于我的自定义 surfaceview 的顶部,导致 surfaceview 隐藏。
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
uiOptions =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
通过将此代码放在主 activity 上,surfaceview 可以很好地覆盖。但是我不能使用导航栏。