在 LinearLayout 上使用个人 SurfaceView

Using personal SurfaceView on LinearLayout

我目前正在开发一个 Android 应用程序,使用个人 SurfaceView 和双缓冲。但是我的代码有点问题。
一方面,我有一个基于 LinearLayout 层次结构的 xml 视图。当我实例化我的活动时,我将我的 contentView 设置在此 xml 上。问题是我的双缓冲不再起作用了。线程正在运行但未显示任何内容。
另一方面,我用新的个人 SurfaveView 元素设置 contentView 并且显示效果很好。但是当然,我无法再访问 LinearLayout.
的其他元素
实际上,我想在我的 xml 视图上设置我的 contentView 并且 保持我的显示工作。

我希望我已经足够清楚了,谢谢你的回答!

这是我的活动:

public class MainController extends Activity {
    @Override
    protected void onCreate(final Bundle p_savedInstanceState) {
        super.onCreate(p_savedInstanceState);
        setContentView(R.layout.main_controller_activity);

        this.drawableView = (MCustomDrawableView) findViewById(R.id.drawingBox);

        ...
    }
    ...
}

我的表面观点:

public class MCustomDrawableView extends SurfaceView {
    public MCustomDrawableView(Context p_context, AttributeSet p_attributes) {
        super(p_context, p_attributes);

        this.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(final SurfaceHolder p_holder) {
                try {
                    // Instantiating a new thread
                    thread = new MBufferingThread(getInstance());

                    thread.start();

                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(final SurfaceHolder p_holder, int p_format, int p_width, int p_height) {...}

            @Override
            public void surfaceDestroyed(final SurfaceHolder p_holder) {...}
        });

        // Setup drawing options
        setupDrawing();
    }
    ...
}

还有我的 xml 观点:

<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:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:background="@color/app_background"
    tools:context=".MainController">

    <com.iskn.calligraphy.models.draw.MCustomDrawableView
        android:id="@+id/drawingBox"
        style="@style/DrawingBox" />

    <SeekBar
        android:id="@+id/brushSize"
        style="@style/SizeSeekBar" />

    <SeekBar
        android:id="@+id/brushOpacity"
        style="@style/OpacitySeekBar" />

</LinearLayout>

编辑:
经过进一步的研究和分析,显然:

在这两种情况下:

好吧,我找到了一个实用的解决方案:

我认为问题出在 MCustomDrawableView 初始化上。我从 onCreate 方法而不是 xml 文件创建了 class 的新实例。然后,我将它设置为 contentView:

   protected void onCreate(Bundle p_savedInstanceState) {
        super.onCreate(p_savedInstanceState);
        setContentView(R.layout.main_controller_activity);

        // Instantiate drawable object & set style properties
        this.drawableView = new MCustomDrawableView(getApplicationContext());
        FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                FrameLayout.LayoutParams.MATCH_PARENT);

        // Add the drawable view to the main_activity
        addContentView(this.drawableView, style);
    } 

但是这种方式又带来了新的问题。添加的视图在顶部,这意味着所有其他视图 View 都被隐藏了。我用下面的方法 bringToBack(this.drawableView) 解决了这个问题:

private void bringToBack(View p_view) {
    // Get parent from the current view
    ViewGroup viewGroup = ((ViewGroup) p_view.getParent());

    int childrenCount = viewGroup.indexOfChild(p_view);
    for(int cpt = 0; cpt < childrenCount; cpt++) {
        // Move the child to the top
        viewGroup.bringChildToFront(viewGroup.getChildAt(cpt));
    }
}

它将提供的视图带回背景位置。我还必须将 LinearLayout 的 alpha 设置为 0。

我仍然愿意接受其他解决方案!