Как нарисовать наложение на SurfaceView, используемый камерой на Android?
у меня есть простая программа, которая рисует эскиз 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);
}
}
3 ответов:
SurfaceViewнаверное не работает как обычныйViewв этой связи.вместо этого, сделайте следующее:
- положить
SurfaceViewвнутри aFrameLayoutилиRelativeLayoutin ваш XML-файл макета, так как оба те позволяют штабелировать виджетов на Z-оси- переместить логику рисования в отдельный заказ
Viewкласс- добавить экземпляр пользовательского представления класс в макет XML-файл в качестве дитя
FrameLayoutилиRelativeLayout, но он появится послеSurfaceViewэто вызовет ваш заказ
Viewкласс, чтобы появиться, чтобы плавать надSurfaceView.смотрите здесь пример проекта что слои всплывающие панели выше a
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.
Comments