Хорошо, спасибо 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>
И чем я создал еще один держатель для новой поверхности, это часть моего кода 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);
}
Как вы можете видеть, я очистить холст каждый раз, если я этого не сделаю, поверхность отобразит дополнительно больше прямоугольников друг на друга.
Это, как я взываю к этому методу от события А «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 может иметь только один «производитель». Поскольку камера рисует его, вы также не можете рисовать его с помощью Canvas. Вам нужно опираться на другую поверхность; наиболее эффективным вариантом будет использование прозрачного представления. Другим подходом было бы отправить камеру в SurfaceTexture и отобразить ее с помощью GLES, что даст вам полную свободу. См. «текстура с камеры» на https://github.com/google/grafika. – fadden
Можете ли вы привести пример, как создать прозрачный вид? Все, что я нашел, это примеры, которые показывают только прямоугольник и устанавливают представление как * setContentView (drawView); * так, что я не вижу камеру. – user2235615