Camera Controls
The CameraManager
allows you to switch between front and back camera, continuous focus and one time focus as well as control the zoom. We created a activity_camera_control.xml
layout file, were we define some simple ui components for all exposed settings, please browse the sample app code if you would like to have a look at this file.
With the layout file in place we are ready to connect the UI components and the CameraManager
.
The first component we connect is the flash light on/off switch, were we set a anonymous OnCheckedChangeListener
in which we retrieve the CameraManager
from the WikitudeSDK and enable or disable the flash light by calling enableCameraFlash
or disableCameraFlash
.
For the zoom SeekBar
we first set the maximum value of the SeekBar
to the maximum zoom value returned by the CameraManager
, to create a wider range of values we multiply the returned value by 100. Then again we set a anonymous Listener to react on the user input. Since we widened the value range, we need to divide the current Seekbar
value by 100 before we pass it back to the CameraManager
by calling setZoomLevel
.
@Override
public void onRenderExtensionCreated(final RenderExtension renderExtension_) {
...
Switch flashToggleButton = (Switch) findViewById(R.id.flashlight);
flashToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
if (isChecked) {
_wikitudeSDK.getCameraManager().enableCameraFlashLight();
} else {
_wikitudeSDK.getCameraManager().disableCameraFlashLight();
}
}
});
SeekBar zoomSeekBar = (SeekBar) findViewById(R.id.zoomSeekBar);
zoomSeekBar.setMax(((int) _wikitudeSDK.getCameraManager().getMaxZoomLevel()) * 100);
zoomSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
if (progress > 0) {
_wikitudeSDK.getCameraManager().setZoomLevel((float) progress / 100.0f);
}
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(final SeekBar seekBar) {
}
});
Since we use two Spinners
to control the camera position and focus mode, we don't go with anonymous listeners, but let the activity implement onItemSelectedListener
and handle both spinners in the same method. For both focus mode and camera position CameraManager
exposes setters to pick a value. We use the appropriate enums
provided by the CameraSettings
class to choose from the available settings.
@Override
public void onRenderExtensionCreated(final RenderExtension renderExtension_) {
...
Spinner cameraPositionSpinner = (Spinner) findViewById(R.id.cameraPosition);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.camera_positions, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
cameraPositionSpinner.setAdapter(adapter);
cameraPositionSpinner.setOnItemSelectedListener(this);
Spinner focusModeSpinner = (Spinner) findViewById(R.id.focusMode);
adapter = ArrayAdapter.createFromResource(this, R.array.focus_mode, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
focusModeSpinner.setAdapter(adapter);
focusModeSpinner.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(final AdapterView<?> adapterView_, final View view_, final int position, final long id) {
switch (adapterView_.getId()) {
case R.id.focusMode:
if (position == 0) {
_wikitudeSDK.getCameraManager().setFocusMode(CameraSettings.CameraFocusMode.CONTINUOUS);
} else {
_wikitudeSDK.getCameraManager().setFocusMode(CameraSettings.CameraFocusMode.ONCE);
}
break;
case R.id.cameraPosition:
if (position == 0) {
_wikitudeSDK.getCameraManager().setCameraPosition(CameraSettings.CameraPosition.BACK);
} else {
_wikitudeSDK.getCameraManager().setCameraPosition(CameraSettings.CameraPosition.FRONT);
}
break;
}
}