防止自定义SurfaceView在其他视图之上绘制

Dan*_*iel 2 android drawing android-layout

我创建了一个自定义的SurfaceView,用于绘制形状,用户可以缩放和平移视图以与形状进行交互。这一切的伟大工程,但现在的问题是,形状将总是在顶部绘制一切都在我的屏幕上,还对如按钮和textviews其他视图顶部。我尝试过以不同的方式在XML布局中对自定义视图和按钮进行排序,并尝试将视图作为FrameLayouts和RelativeLayouts的父项(如此处建议)。

我希望按钮和其他布局元素浮在我的自定义视图之上。如下图所示,当我平移视图时,矩形将遮盖按钮。

如何防止自定义SurfaceView绘制在所有内容之上?

在此处输入图片说明

我的绘图代码在SurfaceView类的单独线程中运行:

public class CustomShapeView extends SurfaceView implements Runnable, SurfaceHolder.Callback {

/* Other implementation stuff */

@Override
public void run() {
    while (isDrawing) {
        if (!holder.getSurface().isValid())
            continue; //wait till it becomes valid  

        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas(null);
            synchronized (holder) {
                try {
                    lock.lock();                                
                    canvas.concat(sampleMatrix);
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                    drawShapes(canvas);                     
                } finally {
                    lock.unlock();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }       
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我的测试XML布局是:我希望在自定义视图后面创建一个按钮(左),并在该自定义视图上方浮动一个按钮(向右):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Left"
    android:id="@+id/button"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"/>

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.CustomShapeView
        android:id="@+id/floor_plan_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</FrameLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right"
        android:id="@+id/button2"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>
</RelativeLayout>   
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 6

在我的代码中,我正在调用该函数setZOrderOnTop(true);,以确保将表面视图始终绘制在所有内容之上。这段代码是由以前的开发人员保留的,以便为画布提供自定义背景,而不仅仅是纯色。使用SurfaceView,需要在画布上具有自定义背景或能够在画布顶部绘制视图之间进行权衡。

选项是

  1. 随着setZOrderOnTop(true);有可自定义的背景,但没有重叠的看法。
  2. 随着setZOrderOnTop(false);有可能(通过调用如叠加的意见,但在画布只有纯色背景的canvas.drawColor(Color.WHITE);绘制调用之间清除)。

我选择第二个选项是因为我重视在自定义背景上叠加视图。