반응형
Android의 카메라에서 사용하는 SurfaceView에 오버레이를 그리는 방법은 무엇입니까?
나는의 미리보기를 그리는 간단한 프로그램이 Camera
로를 SurfaceView
. 내가하려는 것은 메서드를 호출해야하는 메서드 를 실행하기 위해 onPreviewFrame
새 프레임이에 그려 질 때마다 호출되는 메서드를 사용하는 것입니다. 실제로 메서드가 호출되지만 인쇄되는 것은 없습니다 (카메라 미리보기가 내가 그리려는 텍스트를 덮어 쓰는 것 같습니다).SurfaceView
invalidate
onDraw
onDraw
이것은 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);
}
}
SurfaceView
View
이 점에서 일반처럼 작동하지 않을 것입니다 .
대신 다음을 수행하십시오.
- 당신 넣어
SurfaceView
(A)의 내부FrameLayout
또는RelativeLayout
그 모두가 Z 축에 위젯으로 적재 할 수 있기 때문에, 레이아웃 XML 파일에 - 그리기 논리를 별도의 사용자 지정
View
클래스 로 이동 - 사용자 정의 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의 그리기 메서드에서 작업을 수행하기 전에 먼저 메서드를 호출해야한다고 생각합니다 .
반응형
'code' 카테고리의 다른 글
copy-local은 언제 true로 설정해야하고 언제 그렇지 않아야합니까? (0) | 2020.11.05 |
---|---|
C # Windows API를 통해 파일에서 축소판 가져 오기 (0) | 2020.11.05 |
C #의 C ++ 유니온 (0) | 2020.11.05 |
Ruby에서 파이프 기호는 무엇입니까? (0) | 2020.11.05 |
POCO는 무엇을 의미합니까? (0) | 2020.11.05 |