좋아요, fadden 덕분에 가장 쉬운 해결책을 찾았습니다 (적어도 나를 위해).
먼저 내가 다른 표면보기를 만들어 내 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>
그리고 새로운 표면에 대한 또 다른 홀더를 생성하고있어보다가,이 내 자바 코드의 일부이다 나는 메서드를 호출 구현할 마침내
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);
}
당신이 볼 수 있듯이, 내가 지우 캔버스 때마다, 내가이 일을하지 않으면 표면에 더 많은 사각형이 서로 표시됩니다.
이 내가 '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);
}
};
희망.
주어진 SurfaceView 표면에는 하나의 "생산자"만있을 수 있습니다. 카메라가 그려져 있기 때문에 캔버스로 그릴 수 없습니다. 다른 서페이스에 그려야합니다. 가장 효율적인 옵션은 투명한 뷰를 사용하는 것입니다. 또 다른 방법은 카메라를 SurfaceTexture로 보내고 GLES로 렌더링하는 것입니다. 그러면 GLES로 렌더링되므로 완전히 자유롭게 사용할 수 있습니다. 예 : https://github.com/google/grafika의 '카메라의 질감' – fadden
투명한 뷰를 생성하는 방법을 보여줄 수 있습니까? 내가 발견 한 것은 직사각형 만 표시하고 뷰를 * setContentView (drawView); *로 설정 한 예제입니다. 카메라가 보이지 않는 것보다. – user2235615