Built-in Buttons
You may want different icons, additional features or just arrange the screen differently.
In this case, you will use CameraAwesomeBuilder.custom()
instead of CameraAwesomeBuiilder.awesome()
.
Yet, if some of our buttons suit your needs, feel free to use them!
AwesomeMediaPreview
Shows a clickable preview of a media captured using CamerAwesome.
This widget rotates when the camera rotates.
Below example shows how to show the last captured media using AwesomeMediaPreview
.
StreamBuilder<MediaCapture?>(
stream: state.captureState$,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Container(width: 72, height: 72);
}
return SizedBox(
width: 72,
child: AwesomeMediaPreview(
mediaCapture: snapshot.requireData,
onMediaTap: onMediaTap,
),
);
},
)
Note: video preview is not implemented in this widget since it would imply a dependency to other packages.
You can find an alternative widget that auto plays the last video recorded in the example
project at widgets/custom_media_preview.dart
.
It uses the video_player
package under the hood.
See its usage in custom_ui_example_3.dart
.
AwesomeBouncingWidget
This widget is used to make its child bounce when pressed.
AwesomeBouncingWidget(
// On tap callback. Set it to null to disable the button
onTap: () {
// Do something
},
// Opacity of the widget when disabled
disabledOpacity: 0.3,
// Duration of the bounce animation
duration: const Duration(milliseconds: 100),
// Wether or not the widget should vibrate when pressed
vibrationEnabled: true,
// Your child widget
child: MyChild(),
)
AwesomeFlashButton
Choose the Flash mode of the camera.
Supported flash modes are:
- FlashMode.none
- FlashMode.on
- FlashMode.auto
- FlashMode.always
This button rotates when the camera rotates.
Full example:
AwesomeFlashButton(
// Current CameraState
state: state,
// You can provide your own icon builder with a custom icon for each flash mode for example.
iconBuilder: (flashMode) {
switch (flashMode) {
case FlashMode.none:
return const Icon(Icons.flash_off);
case FlashMode.on:
return const Icon(Icons.flash_on);
case FlashMode.auto:
return const Icon(Icons.flash_auto);
case FlashMode.always:
return const Icon(Icons.flashlight_on);
}
},
// You can provide a custom theme to the button. If you don't, it will use the theme from CameraAwesomeBuilder
theme: AwesomeTheme(
buttonTheme: AwesomeButtonTheme(
iconSize: 28,
padding: const EdgeInsets.all(8),
foregroundColor: Colors.black,
backgroundColor: Colors.white,
),
),
onFlashTap: (sensorConfig, flashMode) {
// You may want to update your custom UI or save the flash mode in the settings of your app for example
doSomethingCustom();
// Finally, update the flash mode of the sensor config
sensorConfig.setFlashMode(flashMode);
},
)
Note: state
is the only required parameter. Other ones have default values.
AwesomeCameraSwitchButton
Switch between Front and Back camera.
This button rotates when the camera rotates.
AwesomeCameraSwitchButton(
// Current CameraState
state: state,
// You can set a scale value for this button to make it look smaller or bigger than the other ones
scale: 1.5,
// You can provide a custom theme to the button. If you don't, it will use the theme from CameraAwesomeBuilder
theme: AwesomeTheme(
buttonTheme: AwesomeButtonTheme(
iconSize: 28,
padding: const EdgeInsets.all(8),
foregroundColor: Colors.black,
backgroundColor: Colors.white,
),
),
// Change the switch camera behaviour logic
onSwitchTap: (state) {
// Aspect ratio is reset by default when switching cameras (it goes back to 4:3).
// You can change this behaviour by overriding the aspect ratio in the switchCameraSensor method.
state.switchCameraSensor(
aspectRatio: state.sensorConfig.aspectRatio,
);
},
// Set the icon you want to display for the switch camera button
iconBuilder: () {
return MyCustomIcon();
},
)
Note: state
is the only required parameter. Other ones have default values.
⚠️ By default, the SensorConfig goes back to a SensorConfig
with the default values of its constructor:
SensorConfig({
required this.sensor,
FlashMode flash = FlashMode.none,
SensorType type = SensorType.wideAngle,
this.captureDeviceId,
CameraAspectRatios aspectRatio = CameraAspectRatios.ratio_4_3,
double currentZoom = 0.0,
})
This behaviour may be improved in a future update.
AwesomeCaptureButton
Take a photo when in Photo mode or start/stop recording when in Video mode.
AwesomeCaptureButton(state: state)
AwesomeAspectRatioButton
Change the aspect ratio of the camera using this widget.
Supported ratios are:
- 4:3
- 16:9
- 1:1
This button rotates when the camera rotates.
AwesomeAspectRatioButton(
state: state,
// Custom icon builder
iconBuilder: (aspectRatio) {
switch (aspectRatio) {
case CameraAspectRatios.ratio_16_9:
return const Icon(Icons.crop_16_9);
case CameraAspectRatios.ratio_4_3:
return const Icon(Icons.crop_7_5);
case CameraAspectRatios.ratio_1_1:
return const Icon(Icons.crop_square);
default:
return const SizedBox();
}
},
// You can provide a custom theme to the button. If you don't, it will use the theme from CameraAwesomeBuilder
theme: AwesomeTheme(
buttonTheme: AwesomeButtonTheme(
iconSize: 28,
padding: const EdgeInsets.all(8),
foregroundColor: Colors.black,
backgroundColor: Colors.white,
),
),
onAspectRatioTap: (sensorConfig, aspectRatio) {
// Do something custom
doSomething();
// Set the aspect ratio
sensorConfig.setAspectRatio(aspectRatio);
},
)
Note: state
is the only required parameter. Other ones have default values.
AwesomeLocationButton
When taking a photo, enable or disable the save of the current location in the exif metadata.
This button rotates when the camera rotates.
AwesomeLocationButton(
// Current CameraState
state: state,
// Change the icon based on saveGpsLocation
iconBuilder: (saveGpsLocation) {
if (saveGpsLocation) {
return const Icon(Icons.location_pin);
} else {
return const Icon(Icons.location_off_outlined);
}
},
// You can provide a custom theme to the button. If you don't, it will use the theme from CameraAwesomeBuilder
theme: AwesomeTheme(
buttonTheme: AwesomeButtonTheme(
iconSize: 28,
padding: const EdgeInsets.all(8),
foregroundColor: Colors.black,
backgroundColor: Colors.white,
),
),
// Change the location button behaviour logic
onLocationTap: (state, saveGpsLocation) {
// Your custom logic
doSomethingCustom();
// Default logic
state.shouldSaveGpsLocation(saveGpsLocation);
},
)
AwesomePauseResumeButton
Pause or resume a video recording with this button.
This widget is designed to work with a VideoRecordingCameraState
.
This button rotates when the camera rotates.
AwesomePauseResumeButton(
state: videoRecordingCameraState,
// You can provide a custom theme to the button. If you don't, it will use the theme from CameraAwesomeBuilder
theme: AwesomeTheme(
buttonTheme: AwesomeButtonTheme(
iconSize: 28,
padding: const EdgeInsets.all(8),
foregroundColor: Colors.black,
backgroundColor: Colors.white,
),
),
)
)
### AwesomeSensorTypeSelector (iOS only)
![Swap sensor type](/img/sensors_type.gif)
Change between different sensor types. The widget will adapt itself to the available sensors.
Here is an example of all existing sensors on an iPhone 14 Pro:
- Wide angle.
- Ultra wide angle.
- Telephoto.
- TrueDepth (front camera).
You can call `CamerawesomePlugin.getSensors()` to get the list of available sensors.
_Elements of this widget rotate when the camera rotates._
```dart
AwesomeSensorTypeSelector(state: state)