code

Android의 카메라에서 사용하는 SurfaceView에 오버레이를 그리는 방법은 무엇입니까?

codestyles 2020. 11. 5. 08:03
반응형

Android의 카메라에서 사용하는 SurfaceView에 오버레이를 그리는 방법은 무엇입니까?


나는의 미리보기를 그리는 간단한 프로그램이 Camera로를 SurfaceView. 내가하려는 것은 메서드를 호출해야하는 메서드 를 실행하기 위해 onPreviewFrame새 프레임이에 그려 질 때마다 호출되는 메서드를 사용하는 것입니다. 실제로 메서드가 호출되지만 인쇄되는 것은 없습니다 (카메라 미리보기가 내가 그리려는 텍스트를 덮어 쓰는 것 같습니다).SurfaceViewinvalidateonDrawonDraw

이것은 SurfaceView내가 가진 하위 클래스 의 단순화 버전입니다 .

public class Superficie extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 public Camera camera;
 Superficie(Context context) {
  super(context);
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 public void surfaceCreated(final SurfaceHolder holder) {
  camera = Camera.open();
  try {
   camera.setPreviewDisplay(holder);
   camera.setPreviewCallback(new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera arg1) {
     invalidar();
    }
   });
  } catch (IOException e) {}
 }
 public void invalidar(){
  invalidate();
 }
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewSize(w, h);
  camera.setParameters(parameters);
  camera.startPreview();
 }
 @Override
 public void draw(Canvas canvas) {
  super.draw(canvas);
  // nothing gets drawn :(
  Paint p = new Paint(Color.RED);
  canvas.drawText("PREVIEW", canvas.getWidth() / 2,
    canvas.getHeight() / 2, p);
 }
}

SurfaceViewView이 점에서 일반처럼 작동하지 않을 것입니다 .

대신 다음을 수행하십시오.

  1. 당신 넣어 SurfaceView(A)의 내부 FrameLayout또는 RelativeLayout그 모두가 Z 축에 위젯으로 적재 할 수 있기 때문에, 레이아웃 XML 파일에
  2. 그리기 논리를 별도의 사용자 지정 View클래스 로 이동
  3. 사용자 정의 View 클래스의 인스턴스를 FrameLayout또는 의 자식으로 레이아웃 XML 파일 RelativeLayout에 추가하되SurfaceView

이로 인해 사용자 정의 View클래스가 SurfaceView.

SurfaceView비디오 재생에 사용되는 위에 팝업 패널을 레이어 하는 샘플 프로젝트여기를 참조하십시오 .


setWillNotDraw(false)에서 전화 해보세요 surfaceCreated.

public void surfaceCreated(SurfaceHolder holder) {
    try {
        setWillNotDraw(false); 
        mycam.setPreviewDisplay(holder);
        mycam.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
        Log.d(TAG,"Surface not created");
    }
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawRect(area, rectanglePaint);
    Log.w(this.getClass().getName(), "On Draw Called");
}

및 호출 invalidate에서 onTouchEvent:

public boolean onTouch(View v, MotionEvent event) {

    invalidate();
    return true;
}

super.draw()surfaceView의 그리기 메서드에서 작업을 수행하기 전에 먼저 메서드를 호출해야한다고 생각합니다 .

참고URL : https://stackoverflow.com/questions/2933882/how-to-draw-an-overlay-on-a-surfaceview-used-by-camera-on-android

반응형