mirror of
https://github.com/NaserElziadna/doddle.git
synced 2026-03-13 07:41:06 +08:00
recording page (video view process)
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui' as ui;
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
@@ -7,51 +8,32 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
import 'package:doddle/models/recorder_controller.dart';
|
||||
import 'package:screen_recorder/screen_recorder.dart';
|
||||
|
||||
import '../doddler.dart';
|
||||
import 'recorder_event.dart';
|
||||
import 'recorder_state.dart';
|
||||
|
||||
class RecorderBloc extends Bloc<RecorderEvent, RecorderState> {
|
||||
RecorderController? recorderController =
|
||||
RecorderController(frames: [], globalKey: GlobalKey());
|
||||
int index = 0;
|
||||
bool isRecording = false;
|
||||
int recordingIndex = 0;
|
||||
Timer? timer;
|
||||
ScreenRecorderController? recorderController;
|
||||
List<int>? old_gif = [];
|
||||
|
||||
RecorderBloc({this.recorderController}) : super(InitialRecorderState());
|
||||
|
||||
@override
|
||||
Stream<RecorderState> mapEventToState(RecorderEvent event) async* {
|
||||
if (event is TakeSnapshotEvent) {
|
||||
if (!isRecording) {
|
||||
timer =
|
||||
Timer.periodic(const Duration(milliseconds: 34), (Timer t) async {
|
||||
final frames = recorderController!.frames;
|
||||
if (event is StartRecordingEvent) {
|
||||
recorderController!.start();
|
||||
yield RecordState(RecordStatus.startRecording);
|
||||
} else if (event is PrepareVideoPageEvent) {
|
||||
print(old_gif);
|
||||
recorderController!.stop();
|
||||
yield RecordState(RecordStatus.prepareVideo);
|
||||
List<int>? gif = await recorderController!.export();
|
||||
|
||||
final image = await canvasToImage(event.globalKey!);
|
||||
frames!.add(Frame(frame: image, index: index++));
|
||||
recorderController = recorderController!.copyWith(frames: frames);
|
||||
});
|
||||
}
|
||||
} else if (event is SaveGifEvent) {
|
||||
add(StopRecordingEvent());
|
||||
yield MessageState("Waiting ... ");
|
||||
final gif = await recorderController!.export();
|
||||
yield ShowGifState(gif: gif);
|
||||
} else if (event is StartRecordingEvent) {
|
||||
add(TakeSnapshotEvent(globalKey: Doddler.globalKey));
|
||||
} else if (event is StopRecordingEvent) {
|
||||
timer!.cancel();
|
||||
yield RecordState(RecordStatus.donePreparingVideo,
|
||||
obg: gif!.followedBy(old_gif ?? []).toList());
|
||||
old_gif = gif.followedBy(old_gif ?? []).toList();
|
||||
}
|
||||
}
|
||||
|
||||
Future<ui.Image> canvasToImage(GlobalKey globalKey) async {
|
||||
final boundary =
|
||||
globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
|
||||
|
||||
final image = await boundary.toImage();
|
||||
return image;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,6 @@ import 'package:flutter/cupertino.dart';
|
||||
|
||||
abstract class RecorderEvent {}
|
||||
|
||||
class TakeSnapshotEvent extends RecorderEvent {
|
||||
final GlobalKey? globalKey;
|
||||
|
||||
TakeSnapshotEvent({this.globalKey});
|
||||
}
|
||||
|
||||
class StartRecordingEvent extends RecorderEvent {}
|
||||
|
||||
class StopRecordingEvent extends RecorderEvent {}
|
||||
@@ -18,6 +12,10 @@ class StopVideoEvent extends RecorderEvent {}
|
||||
|
||||
class SaveGifEvent extends RecorderEvent {}
|
||||
|
||||
class PrepareVideoPageEvent extends RecorderEvent {
|
||||
|
||||
}
|
||||
|
||||
class CallNextFrameEvent extends RecorderEvent {
|
||||
final int index;
|
||||
CallNextFrameEvent({
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
import 'package:doddle/models/frame.dart';
|
||||
|
||||
enum RecordStatus {
|
||||
none,
|
||||
prepareVideo,
|
||||
donePreparingVideo,
|
||||
stopRecording,
|
||||
startRecording,
|
||||
stopPlaying,
|
||||
startPlaying
|
||||
}
|
||||
|
||||
abstract class RecorderState {}
|
||||
|
||||
class InitialRecorderState extends RecorderState {}
|
||||
|
||||
class NextFrameState extends RecorderState {
|
||||
final Frame? frame;
|
||||
NextFrameState({
|
||||
this.frame,
|
||||
});
|
||||
class RecordState extends RecorderState {
|
||||
RecordStatus record;
|
||||
Object? obg;
|
||||
RecordState(this.record,{this.obg});
|
||||
}
|
||||
|
||||
class MessageState extends RecorderState {
|
||||
|
||||
Reference in New Issue
Block a user