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

我在这里和网上尝试了一些试验和示例,但没有任何效果对我有用。

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

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

我不想使用外部库,当我试图从持有人那里获取 Canvas 时,我得到了空值。

现在没有代码,对我没有任何作用,如果有人知道如何去做,我会尝试。

这是我已经尝试过的:

Link 1

Link 2

Link 3

感谢帮助!

请您参考如下方法:

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

首先,我创建了另一个 Surface View ,我的 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> 

然后我为新表面创建了另一个持有人,这是我的 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); 
    } 

最后我实现了一个名为“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); 
} 

正如你所看到的,我每次都清除 Canvas ,如果我不这样做,表面将另外显示更多的矩形。

这就是我从“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); 
             } 
         }; 

希望这对其他人有帮助。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!