Flutter自定义歌词UI插件flutter_lyric_custom_ui的使用
Flutter自定义歌词UI插件flutter_lyric_custom_ui的使用
概述
flutter_lyric_custom_ui
是一个用于在 Flutter 中实现自定义歌词界面的插件。它支持高亮显示歌词、平滑动画、翻译歌词等功能,并允许开发者根据需求定制 UI。
功能特性
- ✅ 高亮显示(增强版与普通版)
- ✅ 翻译歌词
- ✅ 平滑动画效果
- ✅ 自定义 UI 和解析功能
展示
-
- 🇨🇳中国用户也可以访问:在线演示(Web)
-
下载示例 APK:
-
运行示例
使用方法
1. 添加依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter_lyric_custom_ui: ^1.0.0
然后运行以下命令以获取依赖:
flutter pub get
2. 初始化插件
在 main.dart
文件中初始化 flutter_lyric_custom_ui
插件,并加载歌词文件。
import 'package:flutter/material.dart';
import 'package:flutter_lyric_custom_ui/flutter_lyric_custom_ui.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LyricPage(),
);
}
}
class LyricPage extends StatefulWidget {
@override
_LyricPageState createState() => _LyricPageState();
}
class _LyricPageState extends State<LyricPage> {
// 歌词控制器
final LyricController _lyricController = LyricController();
@override
void initState() {
super.initState();
// 加载歌词文件
_loadLyrics();
}
Future<void> _loadLyrics() async {
// 从 assets 文件夹中加载歌词文件
String lyricsContent = await rootBundle.loadString('assets/lyrics.txt');
// 解析歌词
_lyricController.parse(lyricsContent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('自定义歌词 UI'),
),
body: Center(
child: LyricView(
controller: _lyricController,
// 自定义 UI
builder: (BuildContext context, LyricItem item, double progress) {
return Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(8),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 显示当前时间
Text(
'当前时间: ${item.time}',
style: TextStyle(fontSize: 14),
),
SizedBox(height: 8),
// 高亮显示当前歌词
Text(
item.text,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: progress > 0.5 ? Colors.blue : Colors.black,
),
),
],
),
);
},
),
),
);
}
}
3. 创建歌词文件
在 assets/lyrics.txt
文件中添加以下歌词数据:
1|00:00.00|前奏
2|00:05.00|这是第一句歌词
3|00:10.00|这是第二句歌词
4|00:15.00|这是第三句歌词
确保在 pubspec.yaml
文件中声明 assets
文件夹:
flutter:
assets:
- assets/lyrics.txt
更多关于Flutter自定义歌词UI插件flutter_lyric_custom_ui的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter自定义歌词UI插件flutter_lyric_custom_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_lyric_custom_ui
是一个用于在 Flutter 应用中显示歌词的自定义 UI 插件。使用这个插件,你可以轻松地在应用中实现歌词的显示、滚动、高亮等功能。以下是如何使用 flutter_lyric_custom_ui
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_lyric_custom_ui
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_lyric_custom_ui: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 flutter_lyric_custom_ui
插件:
import 'package:flutter_lyric_custom_ui/flutter_lyric_custom_ui.dart';
3. 使用 LyricWidget
LyricWidget
是 flutter_lyric_custom_ui
插件中用于显示歌词的核心组件。你可以通过以下方式使用它:
class LyricsPage extends StatelessWidget {
final List<Lyric> lyrics = [
Lyric(text: "Hello, world!", position: 0),
Lyric(text: "This is a test lyric.", position: 5000),
Lyric(text: "Flutter is awesome!", position: 10000),
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Lyrics'),
),
body: LyricWidget(
lyrics: lyrics,
currentPosition: 5000, // 当前播放位置
onLyricSelected: (Lyric lyric) {
print('Lyric selected: ${lyric.text}');
},
),
);
}
}
4. 自定义歌词样式
你可以通过 LyricWidget
的参数来自定义歌词的样式,例如字体大小、颜色、对齐方式等:
LyricWidget(
lyrics: lyrics,
currentPosition: 5000,
onLyricSelected: (Lyric lyric) {
print('Lyric selected: ${lyric.text}');
},
textStyle: TextStyle(
fontSize: 16,
color: Colors.black,
),
highlightTextStyle: TextStyle(
fontSize: 18,
color: Colors.red,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
);
5. 处理歌词滚动
LyricWidget
会自动根据 currentPosition
滚动到当前播放的歌词行。你可以通过更新 currentPosition
来实现歌词的实时滚动:
class LyricsPage extends StatefulWidget {
[@override](/user/override)
_LyricsPageState createState() => _LyricsPageState();
}
class _LyricsPageState extends State<LyricsPage> {
int currentPosition = 0;
final List<Lyric> lyrics = [
Lyric(text: "Hello, world!", position: 0),
Lyric(text: "This is a test lyric.", position: 5000),
Lyric(text: "Flutter is awesome!", position: 10000),
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Lyrics'),
),
body: Column(
children: [
LyricWidget(
lyrics: lyrics,
currentPosition: currentPosition,
onLyricSelected: (Lyric lyric) {
print('Lyric selected: ${lyric.text}');
},
),
ElevatedButton(
onPressed: () {
setState(() {
currentPosition += 1000;
});
},
child: Text('Next'),
),
],
),
);
}
}
6. 处理歌词选择事件
当用户点击某一行歌词时,onLyricSelected
回调会被触发。你可以在这个回调中处理用户选择的歌词:
LyricWidget(
lyrics: lyrics,
currentPosition: currentPosition,
onLyricSelected: (Lyric lyric) {
print('Lyric selected: ${lyric.text}');
// 例如:跳转到歌词对应的播放位置
setState(() {
currentPosition = lyric.position;
});
},
);
7. 其他功能
flutter_lyric_custom_ui
还提供了其他一些功能,例如:
- 歌词对齐方式:通过
textAlign
参数设置歌词的对齐方式。 - 歌词滚动动画:通过
scrollAnimationDuration
参数设置歌词滚动的动画时长。 - 歌词行间距:通过
lineSpacing
参数设置歌词行之间的间距。
8. 完整示例
以下是一个完整的示例,展示了如何使用 flutter_lyric_custom_ui
插件:
import 'package:flutter/material.dart';
import 'package:flutter_lyric_custom_ui/flutter_lyric_custom_ui.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: LyricsPage(),
);
}
}
class LyricsPage extends StatefulWidget {
[@override](/user/override)
_LyricsPageState createState() => _LyricsPageState();
}
class _LyricsPageState extends State<LyricsPage> {
int currentPosition = 0;
final List<Lyric> lyrics = [
Lyric(text: "Hello, world!", position: 0),
Lyric(text: "This is a test lyric.", position: 5000),
Lyric(text: "Flutter is awesome!", position: 10000),
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Lyrics'),
),
body: Column(
children: [
LyricWidget(
lyrics: lyrics,
currentPosition: currentPosition,
onLyricSelected: (Lyric lyric) {
print('Lyric selected: ${lyric.text}');
setState(() {
currentPosition = lyric.position;
});
},
textStyle: TextStyle(
fontSize: 16,
color: Colors.black,
),
highlightTextStyle: TextStyle(
fontSize: 18,
color: Colors.red,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
ElevatedButton(
onPressed: () {
setState(() {
currentPosition += 1000;
});
},
child: Text('Next'),
),
],
),
);
}
}