国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

小項(xiàng)目開(kāi)發(fā)——Android 音樂(lè)播放器

這篇具有很好參考價(jià)值的文章主要介紹了小項(xiàng)目開(kāi)發(fā)——Android 音樂(lè)播放器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

小項(xiàng)目開(kāi)發(fā)——Android 音樂(lè)播放器

一、題目

? 音樂(lè)播放器.

? 要求Activity編程、ListView編程、SeekBar編程、ExoPlayer編程(播放、暫停、停止、上一首、下一首),音樂(lè)文件放在assets/music目錄下,界面自擬.

? 期望最終效果:

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio


二、實(shí)際最終效果

? 分別對(duì)應(yīng)activity_music_list.xml、activity_my_music_player.xml的視圖.

? 點(diǎn)擊列表任何一個(gè)元素都可以直接跳轉(zhuǎn)到音樂(lè)播放界面.

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio


三、模塊分析

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio

? 從題目所期望的效果來(lái)看,需要實(shí)現(xiàn)的主要分為3大模塊:音樂(lè)列表、進(jìn)度條功能按鈕.

? 還有2大可自定義模塊:狀態(tài)欄、導(dǎo)航欄.

但為了盡可能實(shí)現(xiàn)像市面上的大部分音樂(lè)播放器的界面,我在不改變題目原有主功能的基礎(chǔ)上進(jìn)行了重新設(shè)計(jì),即設(shè)計(jì)了2個(gè) Activity(MusicListActivity.java、MyMusicPlayerActivity.java)及其對(duì)應(yīng) Layout(activity_music_list.xmlactivity_my_music_player.xml),分別控制 音樂(lè)列表、音樂(lè)播放,而不是將它們寫(xiě)在一起.


四、思維導(dǎo)圖

? 基于以上分析我決定分以下4大模塊來(lái)進(jìn)行編程:狀態(tài)欄、導(dǎo)航欄、音樂(lè)列表音樂(lè)播放.

? 并以 Layout、Activity 兩大塊 進(jìn)行闡述.

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio


五、Layout

1. 自定義 Theme

? Path:res/values/themes.xml,添加自定義主題樣式,

<style name="Theme.MyMusic" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <!-- Primary brand color. -->
    <item name="colorPrimary">#B22196F3</item>
    <item name="colorPrimaryVariant">#8B19ADD2</item>
    <item name="colorOnPrimary">#FFFFFF</item>
    <!-- Status bar color. -->
    <item name="android:statusBarColor">#B91976D2</item>
</style>

? 并應(yīng)用在了音樂(lè)列表和音樂(lè)播放的 Activity 中(即狀態(tài)欄、導(dǎo)航欄)——AndroidManifest.xml.

android:theme="@style/Theme.MyMusic"

2. 導(dǎo)航欄 LOGO

? music_list.xml:將 LOGO 資源圖片(icon_music_list.png)修改為 白色 以適配導(dǎo)航欄的背景色.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:src="@drawable/icon_music_list" android:tint="@color/white" />
    </item>
</layer-list>

注:LOGO 圖標(biāo) 見(jiàn) ———> [Music Player/icon_music_list.png · Re.Gin/CSDN - 碼云 - 開(kāi)源中國(guó) (gitee.com)](https://gitee.com/ReGinWZY/csdn/blob/master/Music Player/icon_music_list.png)

3. 音樂(lè)列表布局

? 文件名:activity_music_list.xml

? 采用 約束布局ConstrainLayout

? 布局idcl_music_list

? 只有一個(gè) 空白的 占滿整個(gè)屏幕的ListView組件:

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio

4. 音樂(lè)播放布局

? 文件名:activity_my_music_player.xml

? 采用 約束布局ConstrainLayout

? 布局idcl_music_player

注:剩下沒(méi)貼圖的ImageButton同右下角的ibtn_play,只是圖標(biāo)、位置、放縮倍率不同.

音樂(lè)封面可去網(wǎng)易云官網(wǎng)復(fù)制.

按鈕圖標(biāo) 見(jiàn) ———> [Music Player/播放按鈕圖標(biāo) · Re.Gin/CSDN - 碼云 - 開(kāi)源中國(guó) (gitee.com)](https://gitee.com/ReGinWZY/csdn/tree/master/Music Player/播放按鈕圖標(biāo))

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio

5. 設(shè)置APP圖標(biāo)及名字

android 音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn),小項(xiàng)目開(kāi)發(fā),java,android studio

android:icon="@drawable/headphone"
android:label="MyMusicPlayer"

注:APP 圖標(biāo)見(jiàn) ———> [Music Player/headphone.png · Re.Gin/CSDN - 碼云 - 開(kāi)源中國(guó) (gitee.com)](https://gitee.com/ReGinWZY/csdn/blob/master/Music Player/headphone.png)


六、Activity

1. 音樂(lè)列表 Activity

? 文件名:MusicListActivity.java

⑴ 列表元素點(diǎn)擊監(jiān)聽(tīng)器
AdapterView.OnItemClickListener mListenerLv = (parent, view, position, id) -> {
    mIntent.putExtra("selectedIndex", position); // 傳選中音樂(lè)下標(biāo)
    startActivity(mIntent); // 跳轉(zhuǎn)至 MyMusicPlayerActivity
}; // end mLvListener
⑵ 獲取音樂(lè)名
public void getMusics() {
    try {
        String[] musicFileNames = getAssets().list("musics");
        for (int i = 0; i < musicFileNames.length; ++i) {
            musicFileNames[i] = musicFileNames[i].split("\\.")[0]; // 以“.”分割字符串得到不含后綴的音樂(lè)名
            mMusicList.add(musicFileNames[i]);
        } // end for
        mIntent.putExtra("musicArray", musicFileNames); // 將整個(gè)音樂(lè)列表傳給 MyMusicPlayerActivity
    } catch (IOException e) {
        throw new RuntimeException(e);
    } // end catch
} // end getMusics

2. 音樂(lè)播放 Activity

? 文件名:MyMusicPlayerActivity.java

⑴ 獲取音樂(lè)列表信息
public void getIntentMsg() {
    sMusicIndex = mIntent.getIntExtra("selectedIndex", 0); // 默認(rèn)第一首音樂(lè)
    sMusicArray = mIntent.getStringArrayExtra("musicArray");
} // end getIntentMsg
⑵ 音樂(lè)封面圓形剪裁和旋轉(zhuǎn)動(dòng)畫(huà)
API 說(shuō)明
circularCutting Bitmap對(duì)象進(jìn)行圓形剪裁
addAnimation ImageView對(duì)象添加動(dòng)畫(huà)
public Bitmap circularCutting(Bitmap bitmap) {
    mBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(mBitmap);
    Paint paint = new Paint();
    paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
    canvas.drawCircle(bitmap.getWidth() / 2f, bitmap.getHeight() / 2f, bitmap.getWidth() / 2f, paint);
    return mBitmap;
} // end circularCutting

? 首先,使用Bitmap.createBitmap()ARGB_8888一種32位顏色深度的色彩模式創(chuàng)建一個(gè)與原始bitmap大小相同且高質(zhì)量的位圖對(duì)象mBitmap.

? 然后,先使用Canvas對(duì)象將該位圖對(duì)象繪制成一個(gè)圓形,再使用Paint對(duì)象的setShader()方法設(shè)置圓形填充色,通過(guò)BitmapShader對(duì)象將原始 bitmap作為填充紋理.

? 最后,將處理后的位圖對(duì)象返回.

public void addAnimation(ImageView iv) {
    mAnimator = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f); // 360°旋轉(zhuǎn)
    mAnimator.setDuration(40000); // 毫秒
    mAnimator.setRepeatCount(ObjectAnimator.INFINITE); // 動(dòng)畫(huà)無(wú)限循環(huán)
    mAnimator.setInterpolator(new LinearInterpolator()); // 線性插值器
    mAnimator.start(); // 啟動(dòng)動(dòng)畫(huà)
} // end addAnimation

? 首先使用ObjectAnimator.ofFloat()方法創(chuàng)建一個(gè)ObjectAnimator對(duì)象,將其綁定到ImageView對(duì)象的rotation屬性上,設(shè)置動(dòng)畫(huà)的起始值和結(jié)束值,以及動(dòng)畫(huà)的持續(xù)時(shí)間和重復(fù)次數(shù).

? 然后,使用setInterpolator()方法設(shè)置動(dòng)畫(huà)插值器為線性插值器.

? 最后調(diào)用start()方法啟動(dòng)動(dòng)畫(huà).

⑶ 設(shè)置音樂(lè)播放相關(guān)資源
API 說(shuō)明
mPlayerListener 音樂(lè)播放器監(jiān)聽(tīng)器
initExoPlayer 初始化音樂(lè)播放器(ExoPlayer對(duì)象)
updateMusicPlayer 更新音樂(lè)播放器
updateMusicLayout 更新音樂(lè)播放器頁(yè)面
Player.Listener mPlayerListener = new Player.Listener() {
    @Override
    public void onPlaybackStateChanged(int playbackState) {
        if (playbackState == ExoPlayer.STATE_READY) { // 播放器準(zhǔn)備好了
            mExoPlayer.play();
            mPlayStateIbtn.setImageResource(R.drawable.pause);
            mTimer.schedule(new ProgressUpdate(), 0, 500);
        } // end if
    } // end onPlaybackStateChanged
}; // end mPlayerListener

public void initExoPlayer() {
    mExoPlayer = new ExoPlayer.Builder(MyMusicPlayerActivity.this).build();
    /* 一次性將所有音樂(lè)資源添加到音樂(lè)播放器中 */
    for (String musicName : sMusicArray) {
        mediaItem = MediaItem.fromUri("asset:///musics/" + musicName + ".mp3");
        mExoPlayer.addMediaItem(mediaItem);
    } // end for
    updateMusicPlayer(sMusicIndex);
    mExoPlayer.setRepeatMode(ExoPlayer.REPEAT_MODE_ALL); // 默認(rèn)列表循環(huán)
    mPlayMode = mExoPlayer.getRepeatMode();
    mExoPlayer.addListener(mPlayerListener);
} // end initExoPlayer

? 對(duì)于 asset 文件夾里的資源,可以以asset:///path形式得到資源的URI.

? 這里一次性將 MusicListActivity 傳來(lái)的所有音樂(lè)資源添加到音樂(lè)播放器中,以便后續(xù)直接通過(guò) 索引位置 進(jìn)行相關(guān)操作.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-813244.html

public void updateMusicPlayer(int index) {
    updateMusicLayout(index); // 更新頁(yè)面
    mExoPlayer.seekTo(index, 0);
    mExoPlayer.prepare();
} // end updateExoPlayer

public void updateMusicLayout(int index) {
    mMusicTitleTv.setText(sMusicArray[index]);
    try {
        InputStream inputStream = getAssets().open("music_images/" + sMusicArray[index] + ".jpg");
        mBitmap = BitmapFactory.decodeStream(inputStream);
        mMusicCoverIv.setImageBitmap(circularCutting(mBitmap));
        inputStream.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    } // end catch
} // end updateMusicLayout
⑷ 進(jìn)度條
SeekBar.OnSeekBarChangeListener mListenerSb = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        /* 從用戶拖動(dòng)到的位置開(kāi)始播放 */
        if (fromUser) {
            mExoPlayer.seekTo(sMusicIndex, progress);
        }
        /* 列表循環(huán)狀態(tài)下,音樂(lè)會(huì)自動(dòng)到下一首,此時(shí)需要重新渲染頁(yè)面元素 */
        if (sMusicIndex != mExoPlayer.getCurrentMediaItemIndex()
            && mPlayMode == mExoPlayer.REPEAT_MODE_ALL) {
            sMusicIndex = mExoPlayer.getCurrentMediaItemIndex();
            updateMusicLayout(sMusicIndex);
            mAnimator.cancel();
            mAnimator.start();
        } // end if
    } // end onProgressChanged

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    } // end onStartTrackingTouch

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        mAnimator.resume(); // 用戶停止拖動(dòng)進(jìn)度條,圖片重新旋轉(zhuǎn)
        mStartTimeTv.setText(formatPosition(seekBar.getProgress()));
    } // end onStopTrackingTouch
}; // end mListenerSb

/**
 * 內(nèi)部類(lèi)——定時(shí)任務(wù)類(lèi):定時(shí)更新 SeekBar 進(jìn)度條
 */
private class ProgressUpdate extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(() -> {
            mStartPos = mExoPlayer.getContentPosition();
            mMusicProgressSb.setProgress((int) mStartPos);
            mStartTimeTv.setText(formatPosition(mStartPos));
            mDurationPos = mExoPlayer.getDuration();
            mMusicProgressSb.setMax((int) mDurationPos);
            mDurationTimeTv.setText(formatPosition(mDurationPos));
        }); // end runOnUiThread
    } // end run
} // end ProgressUpdate

/**
 * 格式化音樂(lè)進(jìn)度條起始、終止位置,顯示“分:秒”
 *
 * @param pos 音樂(lè)進(jìn)度條位置
 * @return “分:秒”
 */
public String formatPosition(long pos) {
    @SuppressLint("SimpleDateFormat")
    SimpleDateFormat sdf = new SimpleDateFormat("mm:ss"); // "分:秒"格式
    return sdf.format(pos);
} // end format
⑸ 功能按鈕
API 說(shuō)明
changePlayerMode 更換音樂(lè)播放模式
previousMusic 上一首
changePlayerState 播放/暫停
nextMusic 下一首
stopMusic 停止音樂(lè)
public void changePlayerMode() {
    if (mPlayMode == mExoPlayer.REPEAT_MODE_ALL) {
        mPlayModeIbtn.setImageResource(R.drawable.repeat_once);
        mExoPlayer.setRepeatMode(ExoPlayer.REPEAT_MODE_ONE);
        mPlayMode = ExoPlayer.REPEAT_MODE_ONE;
        Toast.makeText(MyMusicPlayerActivity.this, "單曲循環(huán)", Toast.LENGTH_SHORT).show();
    } else {
        mPlayModeIbtn.setImageResource(R.drawable.repeat_all);
        mExoPlayer.setRepeatMode(ExoPlayer.REPEAT_MODE_ALL);
        mPlayMode = ExoPlayer.REPEAT_MODE_ALL;
        Toast.makeText(MyMusicPlayerActivity.this, "列表循環(huán)", Toast.LENGTH_SHORT).show();
    } // end else
} // end changePlayerMode

public void previousMusic() {
    if (sMusicIndex == 0) {
        sMusicIndex = sMusicArray.length - 1;
    } else sMusicIndex--;
    mAnimator.cancel(); // 上一首取消動(dòng)畫(huà)
    mAnimator.start(); // 并重新開(kāi)始旋轉(zhuǎn)
    updateMusicPlayer(sMusicIndex);
} // end previousMusic

public void changePlayerState() {
    if (mExoPlayer.isPlaying()) {
        mExoPlayer.pause();
        mAnimator.pause(); // 暫停動(dòng)畫(huà),直到遇上 resume()
        mPlayStateIbtn.setImageResource(R.drawable.play);
        mTimer.cancel();
        mTimer = new Timer();
        Toast.makeText(MyMusicPlayerActivity.this, "暫停", Toast.LENGTH_SHORT).show();
    } else {
        mExoPlayer.play();
        mAnimator.resume(); // 將暫停的動(dòng)畫(huà)重新從當(dāng)前位置開(kāi)始旋轉(zhuǎn),而不是重新開(kāi)始
        mPlayStateIbtn.setImageResource(R.drawable.pause);
        mTimer = new Timer();
        mTimer.schedule(new ProgressUpdate(), 0, 500);
        Toast.makeText(MyMusicPlayerActivity.this, "播放", Toast.LENGTH_SHORT).show();
    } // end else
} // end changePlayerState

public void nextMusic() {
    if (sMusicIndex == sMusicArray.length - 1) {
        sMusicIndex = 0;
    } else sMusicIndex++;
    mAnimator.cancel(); // 下一首取消動(dòng)畫(huà)
    mAnimator.start(); // 重新開(kāi)始旋轉(zhuǎn)
    updateMusicPlayer(sMusicIndex);
} // end nextMusic

public void stopMusic() {
    finish();
} // end stopMusic

到了這里,關(guān)于小項(xiàng)目開(kāi)發(fā)——Android 音樂(lè)播放器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于android音樂(lè)播放器的設(shè)計(jì)

    基于android音樂(lè)播放器的設(shè)計(jì)

    本科畢業(yè)論文(設(shè)計(jì))誠(chéng)信聲明 本人鄭重聲明:所呈交的畢業(yè)論文(設(shè)計(jì)),題目《………基于android音樂(lè)播放器的設(shè)計(jì)……………………………》是本人在指導(dǎo)教師的指導(dǎo)下,進(jìn)行研究工作所取得的成果。對(duì)本文的研究作出重要貢獻(xiàn)的個(gè)人和集體,均已在文章以明確方式注

    2024年02月03日
    瀏覽(33)
  • Android課程設(shè)計(jì)大作業(yè)-音樂(lè)播放器

    Android課程設(shè)計(jì)大作業(yè)-音樂(lè)播放器

    1)使用Service播放音樂(lè) Android SDK提供了Service。Service有兩種類(lèi)型: 本地服務(wù)(Local Service):用于應(yīng)用程序內(nèi)部 遠(yuǎn)程服務(wù)(Remote Sercie):用于Android系統(tǒng)內(nèi)部的應(yīng)用程序之間前者用于實(shí)現(xiàn)應(yīng)用程序自己的一些耗時(shí)任務(wù),比如查詢升級(jí)信息,并不占用應(yīng)用程序比如Activity所屬線程,而是單

    2024年02月10日
    瀏覽(20)
  • Android程序設(shè)計(jì)之音樂(lè)播放器實(shí)現(xiàn)

    Android程序設(shè)計(jì)之音樂(lè)播放器實(shí)現(xiàn)

    基于MediaPlayer技術(shù)實(shí)現(xiàn)在線音樂(lè)播放器,播放在線音樂(lè),后端使用SpringBoot將音樂(lè)存放在Tomcat服務(wù)器。app通過(guò)網(wǎng)絡(luò)請(qǐng)求獲取音樂(lè),從而實(shí)現(xiàn)在線音樂(lè)播放。該項(xiàng)目分為用戶端和管理員端 一、核心技術(shù)Service組件介紹 Service它可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而沒(méi)有用戶界面的應(yīng)用組

    2024年02月04日
    瀏覽(19)
  • FPGA開(kāi)發(fā):音樂(lè)播放器

    FPGA開(kāi)發(fā):音樂(lè)播放器

    相關(guān)閱讀? FPGA開(kāi)發(fā)專欄 https://blog.csdn.net/weixin_45791458/category_12388695.html?spm=1001.2014.3001.5482 ? ? ? ? FPGA開(kāi)發(fā)板上的蜂鳴器可以用來(lái)播放音樂(lè),只需要控制蜂鳴器信號(hào)的方波頻率、占空比和持續(xù)時(shí)間即可。 ? ? ? ? 簡(jiǎn)譜上的4/4表示該簡(jiǎn)譜以4分音符為一拍,每小節(jié)4拍,簡(jiǎn)譜上應(yīng)該

    2024年02月14日
    瀏覽(23)
  • 《微信小程序》音樂(lè)播放器項(xiàng)目

    《微信小程序》音樂(lè)播放器項(xiàng)目

    需求:在裝有node.js的機(jī)器上使用微信開(kāi)發(fā)者工具開(kāi)發(fā)一個(gè)音樂(lè)播放項(xiàng)目 寫(xiě)這個(gè)項(xiàng)目的時(shí)候電腦前后藍(lán)屏了5次,制作不易,希望大佬們給個(gè)雙擊,順子在這感謝啦! 展示: pages–index–index.js 01.png 02.png 02stop.png 03.png 04.png 05.png 06.png banner.jpg banner2.jpg banner3.jpg cover.jpg cover1.png

    2024年02月11日
    瀏覽(29)
  • 項(xiàng)目7-音樂(lè)播放器6+評(píng)論區(qū)

    項(xiàng)目7-音樂(lè)播放器6+評(píng)論區(qū)

    前端小白:怎么為你的網(wǎng)頁(yè)增加評(píng)論功能?(一)_為網(wǎng)頁(yè)添加評(píng)論區(qū)怎么弄-CSDN博客 參考的上述文章的前端代碼 我們從上述前端圖片知道,我們數(shù)據(jù)庫(kù)需要準(zhǔn)備的字段: id,commentuserName,coomentmusicId,comment,time 路徑:\\\"/comment/upload\\\" 1.MAPPER 2.SERVICE 3.Controller MAPPER SERVICE CONTROLLER 成功

    2024年04月23日
    瀏覽(34)
  • 項(xiàng)目7-音樂(lè)播放器2(上傳音樂(lè)+查詢音樂(lè)+攔截器)

    項(xiàng)目7-音樂(lè)播放器2(上傳音樂(lè)+查詢音樂(lè)+攔截器)

    之后就不用對(duì)用戶是否登錄進(jìn)行判斷了 生效 請(qǐng)求: { post, /music/upload {singer,MultipartFile file}, } 響應(yīng): { \\\"status\\\": 0, \\\"message\\\": \\\"上傳成功!\\\", \\\"data\\\": true } Java如何判斷一個(gè)文件是否為真實(shí)的MP3文件_判斷一個(gè)文件是否是mp3 文件-CSDN博客 流程:前端進(jìn)行相關(guān)的文件操作-再將上傳的文

    2024年04月17日
    瀏覽(47)
  • HarmonyOS開(kāi)發(fā)案例:【音樂(lè)播放器】

    HarmonyOS開(kāi)發(fā)案例:【音樂(lè)播放器】

    使用ArkTS語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的音樂(lè)播放器應(yīng)用,主要包含以下功能: 播放應(yīng)用中的音頻資源文件,并可進(jìn)行上一曲、下一曲、播放、暫停、切換播放模式(順序播放、單曲循環(huán)、隨機(jī)播放)等操作。 結(jié)合后臺(tái)任務(wù)管理模塊,實(shí)現(xiàn)熄屏后繼續(xù)播放音頻。 相關(guān)概念 [AVPlayer]:

    2024年04月24日
    瀏覽(39)
  • 完整實(shí)例項(xiàng)目:使用python自制音樂(lè)播放器~

    完整實(shí)例項(xiàng)目:使用python自制音樂(lè)播放器~

    今天使用python的pygame等模塊制作了一個(gè)簡(jiǎn)單的音樂(lè)播放器,實(shí)現(xiàn)了很多好玩的功能,在這里和大家一起分享!這是筆者的第二篇博客,也是正式的完成一個(gè)小項(xiàng)目,希望獲得大家的支持~ 暫停、繼續(xù)播放、調(diào)整聲音大小、上一曲下一曲調(diào)整、無(wú)限制追加音樂(lè)(但需要下載音樂(lè)

    2024年02月11日
    瀏覽(21)
  • 微信小程序仿網(wǎng)易音樂(lè)播放器項(xiàng)目

    微信小程序仿網(wǎng)易音樂(lè)播放器項(xiàng)目

    主頁(yè)樣式 播放頁(yè)樣式 搜索頁(yè)樣式 排行榜頁(yè)樣式 小控件樣式 網(wǎng)易云音樂(lè)API接口 后端接口,使用node寫(xiě)的,使用了網(wǎng)易云音樂(lè)API: 封裝的api文件 主頁(yè)面功能點(diǎn) banner,滑動(dòng)菜單欄采用微信的API( swiper 與 scroll-view )進(jìn)行開(kāi)發(fā) 滑動(dòng)到底部重新獲取后續(xù)的歌曲,使用onReachBottom周期

    2024年02月06日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包