Ok, Cảm ơn bạn đã tìm thấy giải pháp đơn giản nhất (ít nhất là đối với tôi).
Trước tiên tôi tạo ra một cái nhìn bề mặt và tập tin XML của tôi trông như thế này:
<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>
Và hơn tôi đang tạo ra một người giữ cho bề mặt mới, đây là một phần của mã java của tôi:
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);
}
cuối cùng tôi thực hiện một phương pháp gọi là '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);
}
Như bạn thấy, tôi xóa canvas mỗi lần, nếu tôi không làm điều này, bề mặt sẽ hiển thị thêm hình chữ nhật trên mỗi hình khác.
Đây là cách tôi gọi phương pháp này từ sự kiện một '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);
}
};
Hy vọng điều này sẽ hữu ích cho người khác.
Bề mặt SurfaceView đã cho chỉ có thể có một "nhà sản xuất". Kể từ khi máy ảnh được vẽ trên nó, bạn cũng không thể vẽ nó bằng Canvas. Bạn cần phải vẽ trên một bề mặt khác; tùy chọn hiệu quả nhất sẽ là sử dụng Chế độ xem trong suốt. Một cách tiếp cận khác là gửi máy ảnh đến SurfaceTexture và render nó với GLES, mang lại cho bạn sự tự do hoàn toàn. Xem ví dụ "kết cấu từ máy ảnh" trên https://github.com/google/grafika. – fadden
Bạn có thể cho tôi ví dụ về cách tạo Chế độ xem trong suốt không? Tất cả những gì tôi tìm thấy là các ví dụ chỉ hiển thị hình chữ nhật và đặt chế độ xem là * setContentView (drawView); * so với tôi không thể thấy máy ảnh. – user2235615