フラッタの浮動オーディオプレーヤー
フラッタの浮動オーディオプレーヤー
今日、我々はフラッターで浮動小数点のオーディオプレーヤーを構築する方法を学びます.この方法はオーディオプレーヤに限らず、ビデオプレーヤにも使用できます.
まず最初に、新しいフラッタープロジェクトを作りましょう.
flutter create floating_audio_player
すべてのコードをmain.dart
次のようにします.import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.teal,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Floating media player')),
body: ListView.builder(itemBuilder: (context, index) {
return Card(
child: Container(
height: 200,
child: Center(
child: Text(
'Item $index',
style: TextStyle(
color: index.isEven ? Colors.white : Colors.green,
),
)),
),
color: index.isEven ? Colors.green : Colors.white70,
);
}),
);
}
}
ここでは、デモンストレーション目的だけのためにカードで無限のリストを描いています.今では、コンテナに変換できるFab(Floating Action Button)を作成します.私たちは使用するつもりですAnimationSwitcher 滑らかなアニメーション.
アップデート
main.dart
追加floatingActionButton
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.teal,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool isPlayerOpened = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Floating media player')),
body: ListView.builder(itemBuilder: (context, index) {
return Card(
child: Container(
height: 200,
child: Center(
child: Text(
'Item $index',
style: TextStyle(
color: index.isEven ? Colors.white : Colors.green,
),
)),
),
color: index.isEven ? Colors.green : Colors.white70,
);
}),
floatingActionButton: floatingActionItem,
);
}
get floatingActionItem {
Widget floatingPlayer = GestureDetector(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(width: 35,),
Container(
height: 125,
width: 325,
color: Colors.teal,
),
],
),
onTap: () {
setState(() {
isPlayerOpened = false;
});
},
);
Widget floatingActionButton = FloatingActionButton(
onPressed: () {
setState(() {
isPlayerOpened = true;
});
},
child: Icon(Icons.play_arrow_outlined),
);
return AnimatedSwitcher(
reverseDuration: Duration(milliseconds: 0),
duration: const Duration(milliseconds: 200),
transitionBuilder: (Widget child, Animation<double> animation) {
return ScaleTransition(child: child, scale: animation);
},
child: isPlayerOpened ? floatingPlayer : floatingActionButton,
);
}
}
エーbool
isPlayerOpened
を使用して再生ボタンまたはコンテナを表示するために使用されますAnimatedSwitcher
.フローティングオーディオプレーヤコードを
FloatingAudioPlayer.dart
, プレーヤーのUIを表示するには、次のコードを追加します.// floating_audio_player.dart
import 'package:flutter/material.dart';
class FloatingAudioPlayer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(width: 35),
Container(
height: 75,
width: 325,
decoration: BoxDecoration(
color: Colors.teal.withOpacity(0.8),
borderRadius: BorderRadius.circular(10.0),
),
child: Row(
children: [
pauseButton(),
Expanded(child: progressSlider()),
],
)),
],
);
}
Widget pauseButton() {
return IconButton(
icon: Icon(Icons.pause_outlined),
onPressed: pause,
);
}
pause() {}
Widget progressSlider() {
const textStyle = TextStyle(color: Colors.white);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 25.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('00:00', style: textStyle),
Text('10:10', style: textStyle),
],
),
),
SizedBox(
width: 300,
height: 25,
child: Slider(
min: 0,
max: 280,
value: 150,
activeColor: Colors.white,
inactiveColor: Colors.grey,
onChanged: (value) {},
),
)
],
);
}
}
あなたは子供の内側を交換してくださいGestureDetector()
インmain.dart
新しく作成したFloatingAudioPlayer()
.最後に、我々はオーディオ再生を実装する予定です.このために私は使用しているjust_audio , あなたの好きなオーディオプレーヤーを使用することができます.
追加
just_audio: ^0.5.6
あなたのpubspec.yml
's dependencies
.注:プラットフォームのチャネルを使用して依存関係をインストールした後、アプリケーションを再起動してください.
Info.plist
ファイル.我々はマイクを使用しないにもかかわらず、IOSはこれを追加する必要があります.<key>NSMicrophoneUsageDescription</key>
<string>... explain why you use (or don't use) the microphone ...</string>
更新floating_audio_player.dart
すべてのオーディオ再生機能.// floating_audio_player.dart
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
class FloatingAudioPlayer extends StatefulWidget {
final Function onPaused;
FloatingAudioPlayer({@required this.onPaused});
@override
_FloatingAudioPlayerState createState() => _FloatingAudioPlayerState();
}
class _FloatingAudioPlayerState extends State<FloatingAudioPlayer> {
Duration _duration;
AudioPlayer _audioPlayer;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(width: 35),
Container(
height: 75,
width: 325,
decoration: BoxDecoration(
color: Colors.teal.withOpacity(0.8),
borderRadius: BorderRadius.circular(10.0),
),
child: StreamBuilder(
stream: _audioPlayer.positionStream,
builder: (context, snapshot) {
if (snapshot.hasData && _duration != null) {
if (_audioPlayer.processingState == ProcessingState.completed) {
_audioPlayer.stop();
Future.delayed(Duration(seconds: 0), widget.onPaused);
}
return Row(
children: [
if (_audioPlayer.playerState.playing)
pauseButton()
else
playButton(),
Expanded(child: progressSlider(snapshot.data)),
],
);
}
return Center(child: CircularProgressIndicator());
},
),
),
],
);
}
Widget playButton() {
return IconButton(
icon: Icon(Icons.play_arrow_outlined),
onPressed: playAudio,
iconSize: 34,
color: Colors.white,
);
}
Widget pauseButton() {
return IconButton(
icon: Icon(Icons.pause_outlined),
onPressed: pause,
iconSize: 34,
color: Colors.white,
);
}
pause() {
_audioPlayer.pause();
Future.delayed(Duration(milliseconds: 500), widget.onPaused);
}
Widget progressSlider(Duration position) {
const textStyle = TextStyle(color: Colors.white);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 25.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(position.toString().substring(2, 7), style: textStyle),
Text(_duration.toString().substring(2, 7), style: textStyle),
],
),
),
SizedBox(
width: 300,
height: 25,
child: Slider(
min: 0,
max: _duration.inMilliseconds.toDouble(),
value: position.inMilliseconds.toDouble(),
activeColor: Colors.white,
inactiveColor: Colors.grey,
onChanged: (value) {
_audioPlayer.seek(Duration(milliseconds: value.floor()));
},
),
)
],
);
}
@override
void initState() {
super.initState();
initAudio();
}
@override
void dispose() {
super.dispose();
_audioPlayer?.dispose();
}
initAudio() async {
_audioPlayer = AudioPlayer();
final duration = await _audioPlayer.setUrl(
'https://s3.amazonaws.com/scifri-episodes/scifri20181123-episode.mp3',
);
setState(() {
_duration = duration;
});
playAudio();
}
playAudio() {
_audioPlayer.play();
}
}
ヒアonPaused
がFloatingAudioPlayer()
ウィジェットは、ユーザーがオーディオを一時停止したり、オーディオが完全に再生されると、浮動小数点のオーディオプレーヤーが閉じられます.同様に、我々は更新する必要があります
main.dart
実施するonPaused
// main.dart
import 'package:flutter/material.dart';
import 'floating_audio_player.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.teal,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool isPlayerOpened = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Floating media player')),
body: ListView.builder(itemBuilder: (context, index) {
return Card(
child: Container(
height: 200,
child: Center(
child: Text(
'Item $index',
style: TextStyle(
color: index.isEven ? Colors.white : Colors.green,
),
)),
),
color: index.isEven ? Colors.green : Colors.white70,
);
}),
floatingActionButton: floatingActionItem,
);
}
onPaused() {
setState(() {
isPlayerOpened = false;
});
}
get floatingActionItem {
Widget floatingPlayer = FloatingAudioPlayer(onPaused: onPaused);
Widget floatingActionButton = FloatingActionButton(
onPressed: () {
setState(() {
isPlayerOpened = true;
});
},
child: Icon(Icons.play_arrow_outlined),
);
return AnimatedSwitcher(
reverseDuration: Duration(milliseconds: 0),
duration: const Duration(milliseconds: 200),
transitionBuilder: (Widget child, Animation<double> animation) {
return ScaleTransition(child: child, scale: animation);
},
child: isPlayerOpened ? floatingPlayer : floatingActionButton,
);
}
}
それで🎉🥳, 我々は、浮動小数点のオーディオプレーヤーを作成している.前述のように、これはオーディオプレーヤーに限らず、何のためにも使用することができます.
今すぐ行って、それで素晴らしいものを作成します.
ソースコードを見つけることができますhere
あなたがどんな提案またはコメントを持っているならば、コメント部で書き留めるのが自由であると感じてください、新しい内容のためにさえずりの上で私について来てください、あるいは、1を提案してください;
ハッピーコーディング!
Reference
この問題について(フラッタの浮動オーディオプレーヤー), 我々は、より多くの情報をここで見つけました https://dev.to/paurakhsharma/floating-audio-player-in-flutter-13hjテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol