Как нарисовать на предварительном просмотре камеры? (Java-андроид) - PullRequest
0 голосов
/ 15 января 2019

Мне нужно получить предварительный просмотр камеры, а затем нарисовать квадрат поверх камеры. Мне удалось получить изображение с камеры, но оно не рисует квадрат. Приложение вылетает. Помогите разобраться, как лучше всего это реализовать?

Я пытался нарисовать, но квадрат быстро исчез или не появился вообще. Я очень хочу это понять.

ShowCamera.java

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
Camera camera;
SurfaceHolder holder;

Path path;

volatile boolean running = false;

public ShowCamera(Context context, Camera camera) {
    super(context);
    this.camera = camera;
    holder = getHolder();
    holder.addCallback(this);
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Camera.Parameters params = camera.getParameters();

    List<Camera.Size> sizes = params.getSupportedPictureSizes();
    Camera.Size mSize = null;

    for(Camera.Size size : sizes){
        mSize = size;
    }
    //change orientation
    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
        params.set("orientation","portrait");
        camera.setDisplayOrientation(90);
        params.setRotation(90);
    }
    else{
        params.set("orientation","landscape");
        camera.setDisplayOrientation(0);
        params.setRotation(0);
    }

    params.setPictureSize(mSize.width,mSize.height);

    camera.setParameters(params);
    try{
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    }
    catch(IOException e){
        e.printStackTrace();
    }
}
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
Button btn_run;
Button btn_select;
TextView tv;
FrameLayout camera_preview;
Camera camera;
ShowCamera showCamera;
DrawView drawView;
Bitmap bitmap;
Canvas canvas;

float x_touch;
float y_touch;
int X_touch;
int Y_touch;
String sDown;

public boolean camera_state = true;
private boolean onSelect = false;
private boolean canSelect = false;
private boolean has_camera = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    // элементы из activity_main
    btn_run = findViewById(R.id.btn_run);
    btn_select = findViewById(R.id.btn_selectStar);
    camera_preview = findViewById(R.id.camera_preview);
    tv = findViewById(R.id.tv);

    // проверка на наличие камеры
    if (!checkCameraHardware(MainActivity.this)) {
        has_camera = false;
        Toast toast = Toast.makeText(this, "Камера не найдена", Toast.LENGTH_LONG);
        toast.show();
    }

    // open camera
    camera = Camera.open();
    showCamera = new ShowCamera(this, camera);
    camera_preview.addView(showCamera);
    camera_preview.setVisibility(View.VISIBLE);
    addTouchListener();

}

public void btnRunOnClick(View view) {
    if (has_camera) {
        if (camera_state) {
            camera_state = false;
            btn_run.setText("Остановить");
            camera_preview.setVisibility(View.VISIBLE);
            Toast toast = Toast.makeText(this, "Камера остановлена", Toast.LENGTH_SHORT);
            toast.show();
            camera.startPreview();
        } else {
            camera_state = true;
            btn_run.setText("Запустить");
            camera_preview.setVisibility(View.VISIBLE);
            Toast toast = Toast.makeText(this, "Камера запущена", Toast.LENGTH_SHORT);
            toast.show();
            camera.stopPreview();
        }
    } else {
        Toast toast = Toast.makeText(this, "Камера не может быть запущена, \nпоскольку ее нет", Toast.LENGTH_LONG);
        toast.show();
    }

}

public void btnSelectStarOnClick(View view) {
    if (onSelect) {
        onSelect = false;
        canSelect = true;
        btn_select.setText("Прекратить");
        Toast toast = Toast.makeText(this, "Выберите объект", Toast.LENGTH_SHORT);
        toast.show();
    } else {
        onSelect = true;
        canSelect = false;
        btn_select.setText("Выбрать");
        Toast toast = Toast.makeText(this, "Выбор запрещен", Toast.LENGTH_SHORT);
        toast.show();
    }
}


private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        return true;
    } else {
        return false;
    }
}


private void addTouchListener(){
    camera_preview.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(canSelect){
                x_touch = event.getX();
                y_touch  = event.getY();
                X_touch = Math.round(x_touch);
                Y_touch = Math.round(y_touch);
                sDown = "Down: " + X_touch + "," + Y_touch;
                tv.setText(sDown);
            }
            return false;
        }
    });
}
}
...