在 SurfaceView 上设置背景
Set background on SurfaceView
我正在开发一个 Android 绘图应用程序,使用 SurfaceView
(更具体地说,它是一个扩展 SurfaceView
的 class)。我已经在这个论坛上看到了很多话题,但我没有得到答案。
我的 activity 基本上是一个 FrameLayout
,它包含了我所有的观点。我想将我的 SurfaceView
设置在我的 FrameLayout
的最低级别,以便查看上层元素(按钮、片段等)。我也想用可绘制对象设置 SurfaceView
的背景,但我遇到了问题。
我首先尝试设置我的 SurfaceView
本身的背景并且它有效。不幸的是,我的绘画内容(canvas 和位图)被这个背景超载了,所以我尝试了第二种解决方案。我将可绘制背景应用到我的 FrameLayout
,并使用 setZOrderOnTop
将我的 SurfaceView
背景设置为透明。我的 SurfaceView
确实是透明的,但是我画的东西在我的按钮和片段上面。
所以我的第一个问题是:为什么我们需要 setZOrderOnTop
来获得透明背景?那么,如何设置一个简单的可绘制背景,保持我的结构层次?
感谢您的回答!
XML 查看:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/repeat_background"
tools:context=".MyActivity">
<!-- Option menu -->
<fragment ... />
<Button ... />
<Button ... />
<Button ... />
...
</FrameLayout>
@drawable/repeat_background
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/drawing_font_texture"
android:tileMode="repeat" />
MyActivity
@Override
protected void onCreate(Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
// Getting my FrameLayout
FrameLayout mainFrame = (FrameLayout) findViewById(R.id.mainFrame);
// Instantiating my SurfaceView
this.drawableView = new MCustomDrawableView(getApplicationContext());
// Don't works
//setZOrderMediaOverlay(true);
this.drawableView.setZOrderOnTop(true);
this.drawableView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
// Add the SurfaceView to the FrameLayout, on lowest position
mainFrame.addView(this.drawableView, 0, style);
}
我认为您的解决方案是正确的。将背景设置为 framelayout 或在 surfaceview 下为您的可绘制对象添加另一个布局。然后增加 surfaceview 的 z 索引和应该在 surfaceview 上方的 buttons/elements 的 z 索引,否则它们在它下面。
如果您使用 material 设计,您还可以设置 elevation in dp 以获得漂亮的阴影。
我正在开发一个 Android 绘图应用程序,使用 SurfaceView
(更具体地说,它是一个扩展 SurfaceView
的 class)。我已经在这个论坛上看到了很多话题,但我没有得到答案。
我的 activity 基本上是一个 FrameLayout
,它包含了我所有的观点。我想将我的 SurfaceView
设置在我的 FrameLayout
的最低级别,以便查看上层元素(按钮、片段等)。我也想用可绘制对象设置 SurfaceView
的背景,但我遇到了问题。
我首先尝试设置我的 SurfaceView
本身的背景并且它有效。不幸的是,我的绘画内容(canvas 和位图)被这个背景超载了,所以我尝试了第二种解决方案。我将可绘制背景应用到我的 FrameLayout
,并使用 setZOrderOnTop
将我的 SurfaceView
背景设置为透明。我的 SurfaceView
确实是透明的,但是我画的东西在我的按钮和片段上面。
所以我的第一个问题是:为什么我们需要 setZOrderOnTop
来获得透明背景?那么,如何设置一个简单的可绘制背景,保持我的结构层次?
感谢您的回答!
XML 查看:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/repeat_background"
tools:context=".MyActivity">
<!-- Option menu -->
<fragment ... />
<Button ... />
<Button ... />
<Button ... />
...
</FrameLayout>
@drawable/repeat_background
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/drawing_font_texture"
android:tileMode="repeat" />
MyActivity
@Override
protected void onCreate(Bundle p_savedInstanceState) {
super.onCreate(p_savedInstanceState);
setContentView(R.layout.main_controller_activity);
// Getting my FrameLayout
FrameLayout mainFrame = (FrameLayout) findViewById(R.id.mainFrame);
// Instantiating my SurfaceView
this.drawableView = new MCustomDrawableView(getApplicationContext());
// Don't works
//setZOrderMediaOverlay(true);
this.drawableView.setZOrderOnTop(true);
this.drawableView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
// Add the SurfaceView to the FrameLayout, on lowest position
mainFrame.addView(this.drawableView, 0, style);
}
我认为您的解决方案是正确的。将背景设置为 framelayout 或在 surfaceview 下为您的可绘制对象添加另一个布局。然后增加 surfaceview 的 z 索引和应该在 surfaceview 上方的 buttons/elements 的 z 索引,否则它们在它下面。 如果您使用 material 设计,您还可以设置 elevation in dp 以获得漂亮的阴影。