Files
flutterApp/lib/features/remote_control/presentation/widgets/left_joystick_area.dart

72 lines
2.1 KiB
Dart

import 'package:cc_ui_kit/cc_ui_kit.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:vibration/vibration.dart';
import '../bloc/remote_control_cubit.dart';
class LeftJoystickArea extends StatelessWidget {
final bool isLocked;
final double width;
const LeftJoystickArea({
Key? key,
required this.isLocked,
required this.width,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min, // 紧凑布局
children: [
// 使用 IgnorePointer 处理锁定逻辑,对应 Android 的 isLocked 判断
IgnorePointer(
ignoring: isLocked,
child: AnimatedOpacity(
duration: const Duration(milliseconds: 300),
opacity: isLocked ? 0.3 : 1.0, // 锁定后变透明
child: CCJoystick(
radius: width, // 对应 size(200.dp)
axisHint: AxisHint.forwardBackward,
onValueChanged: (value) {
// 对应 viewModel.updateOriginY(y)
context.read<RemoteControlCubit>().updateOriginY(value.y);
_triggerVibration();
},
onPress: () {
// 对应 VibrateOnce(current, 100)
//HapticFeedback.mediumImpact();
_triggerVibration();
},
),
),
),
const SizedBox(height: 18),
Text(
"前后控制",
style: TextStyle(
color: Colors.white.withValues(alpha: 0.5),
fontSize: 12,
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 2),
],
);
}
void _triggerVibration() {
Vibration.hasVibrator().then((hasVibrator) {
if (hasVibrator ?? false) {
Vibration.vibrate(duration: 100);
debugPrint('📳 [右摇杆] 震动执行 - 100ms');
} else {
debugPrint('⚠️ [右摇杆] 设备不支持震动');
}
}).catchError((e) {
debugPrint('❌ [右摇杆] 震动失败:$e');
});
}
}