在SurfaceView上绘制矩形

use*_*615 7 surfaceview android-camera

我想知道如何在特定位置和大小绘制矩形.

我在这里和网上尝试了几个试验和例子,但没有任何对我有用.

我正在使用SurfaceView和SurfaceHolder来保存相机预览.

我只想在用户触摸屏幕时绘制一个矩形.

我不想使用外部库,当我试图从持有者那里获得画布时我得到了null.

现在没有代码,因为没有什么工作对我来说,如果有人知道怎么做,我会尝试.

这是我已经尝试过的:

链接1

链接2

链接3

感谢帮助!

use*_*615 7

好的,感谢fadden,我找到了最简单的解决方案(至少对我而言).

首先,我创建了另一个Surface视图,我的XML文件如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:opencv="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="left|top">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

                    <SurfaceView
                        android:layout_alignParentTop="true"
                        android:id="@+id/CameraView"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                    <SurfaceView
                        android:layout_alignParentTop="true"
                        android:id="@+id/TransparentView"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
           </RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

而且我为新表面创建了另一个持有者,这是我的java代码的一部分:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_capture);
        // Create first surface with his holder(holder)
        cameraView = (SurfaceView)findViewById(R.id.CameraView);
        cameraView.setOnTouchListener(onTouchListner);

        holder = cameraView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        // Create second surface with another holder (holderTransparent)
        transparentView = (SurfaceView)findViewById(R.id.TransparentView);

        holderTransparent = transparentView.getHolder();
        holderTransparent.setFormat(PixelFormat.TRANSPARENT);
        holderTransparent.addCallback(callBack); 
        holderTransparent.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
Run Code Online (Sandbox Code Playgroud)

最后我实现了一个名为'DrawFocusRect'的方法

private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color)
{

    canvas = holderTransparent.lockCanvas();
    canvas.drawColor(0,Mode.CLEAR);
    //border's properties
    paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(color);
    paint.setStrokeWidth(3);
    canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);


    holderTransparent.unlockCanvasAndPost(canvas);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我每次都清除画布,如果我不这样做,表面将在彼此上显示更多的矩形.

这就是我从'OnTouchListener'事件调用此方法的方法:

OnTouchListener onTouchListner = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
                    RectLeft = event.getX() - 100;
                    RectTop = event.getY() - 100 ;
                    RectRight = event.getX() + 100;
                    RectBottom = event.getY() + 100;
                    DrawFocusRect(RectLeft , RectTop , RectRight , RectBottom , Color.BLUE);
             }
         };
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助.

  • FWIW,如果SurfaceView曲面重叠,则需要使用SurfaceHolder API为它们提供不同的深度(Z顺序).您可以在Grafika的多表面测试中看到一个包含三个重叠软件渲染的SurfaceView的活动(https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java). (4认同)