フラッタの浮動オーディオプレーヤー


フラッタの浮動オーディオプレーヤー


今日、我々はフラッターで浮動小数点のオーディオプレーヤーを構築する方法を学びます.この方法はオーディオプレーヤに限らず、ビデオプレーヤにも使用できます.

まず最初に、新しいフラッタープロジェクトを作りましょう.
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 .
注:プラットフォームのチャネルを使用して依存関係をインストールした後、アプリケーションを再起動してください.
  • IOSの場合:次のあなたの内側を追加してください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();
      }
    }
    
    ヒアonPausedFloatingAudioPlayer() ウィジェットは、ユーザーがオーディオを一時停止したり、オーディオが完全に再生されると、浮動小数点のオーディオプレーヤーが閉じられます.
    同様に、我々は更新する必要があります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を提案してください;
    ハッピーコーディング!