Как нарисовать наложение на 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);
}
}
512   3  

3 ответов:

SurfaceView наверное не работает как обычный View в этой связи.

вместо этого, сделайте следующее:

  1. положить SurfaceView внутри a FrameLayout или RelativeLayout in ваш XML-файл макета, так как оба те позволяют штабелировать виджетов на Z-оси
  2. переместить логику рисования в отдельный заказ View класс
  3. добавить экземпляр пользовательского представления класс в макет 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

    Ничего не найдено.