Camera2在预览的TextureView上画矩形
盖天地不全,这经原是全全的,今沾破了, 乃是应不全之奥妙也,岂人力 所能与耶! 愿来者补充
使用手机摄像头进行人脸检测,对图像进行处理然后,画出矩形在预览的图像中。其他的也类似。
使用TextureView对Camera进行预览,然后想在上面画出矩形,使用了TextureView类的方法,但都不行。,其他人解释是:进行预览的时候,是使用了GPU进行渲染,在硬件层进行操作。。而TextureView类的方法都是在软件层进行改动,是没有办法进行修改的。
尝试一
使用跟SurfaceView一样的方法,处于底层并在上层进行画框。但是就第一步就不行,TextureView就没有办法处于底层。
尝试二
直接弄个透明的ImageView进行覆盖,然后再ImageView中画框,尝试了一下,好像还是不行,不过我觉得有救,哈哈。
最终版本:
既然SurfaceView可以处于顶层,那我就是用一个透明的Surfaceview处于顶层然后,在SurfaceView中画框。就可以了
xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".camera.CameraActivity">
<FrameLayout
android:id="@+id/frame_layout_rect"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextureView
android:id="@+id/texture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</RelativeLayout>
这里是设置一下SurfaceView并获取到surfaceHolder便于后面画框
surfaceview.setZOrderOnTop(true);//处于顶层
surfaceview.getHolder().setFormat(PixelFormat.TRANSPARENT);//设置surface为透明
surfaceHolder=surfaceview.getHolder();
画框,,其中还有一个重要的,怎么清楚掉上一次的画框。
很简单,但是我也很麻烦
//定义画笔
Paint mpaint = new Paint();
mpaint.setColor(Color.BLUE);
// mpaint.setAntiAlias(true);//去锯齿
mpaint.setStyle(Paint.Style.STROKE);//空心
// 设置paint的外框宽度
mpaint.setStrokeWidth(2f);
Canvas canvas=new Canvas();
canvas = surfaceHolder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //清楚掉上一次的画框。
Rect r = new Rect(0,0,100,100);
canvas.drawRect(r, mpaint);
surfaceHolder.unlockCanvasAndPost(canvas);
到这里就可以可以实现上述功能了,哈哈。