当前位置: 首页 > news >正文

手机商城网站如何wordpress主题市场

手机商城网站如何,wordpress主题市场,上海哪家做网站关键词排名,网站如何做会员登录页面Android – 简易音乐播放器 播放器功能#xff1a;* 1. 播放模式#xff1a;单曲、列表循环、列表随机#xff1b;* 2. 后台播放#xff08;单例模式#xff09;#xff1b;* 3. 多位置同步状态回调#xff1b;处理模块#xff1a;* 1. 提取文件信息#xff1a;音频文…Android – 简易音乐播放器 播放器功能* 1. 播放模式单曲、列表循环、列表随机* 2. 后台播放单例模式* 3. 多位置同步状态回调处理模块* 1. 提取文件信息音频文件.mp3 - 对象类(AudioBean);* 2. 后台播放管理VMPlayer(实现对音频的播放相关处理)* 3. UI显示及控制歌曲列表 播放控制器效果 模块一处理音频文件后台服务内 /** * 同步指定文件夹下音频文件 * * param autoPlay 是否自动播放 */ private void flashAudioRes(boolean autoPlay) {Log.d(TAG, 同步音频中...);new Thread(() - {try {ListAudioBean audioItems synLocalMusic2(FileUtils.getAudioDir());if (audioItems ! null !audioItems.isEmpty()) {//排序Collections.sort(audioItems, (o1, o2) - o1.getDisplayName().compareTo(o2.getDisplayName()));VMPlayer.getInstance().setPlayList(audioItems);if(autoPlay){Thread.sleep(1000);VMPlayer.getInstance().resetIndex();VMPlayer.getInstance().play();VMPlayer.getInstance().notifyListChanged();}} else {//closeDialogSyn(本地无有效音频文件, 3000);}} catch (Exception e) {e.printStackTrace();}}).start();}/*** 同步指定文件夹下音频文件仅一层* param dir 文件夹*/private ListAudioBean synLocalMusic2(String dir) {File root new File(dir);if (root.exists()) {File[] files root.listFiles();if (files null || files.length 1) {return null;}ListAudioBean list new ArrayList();MediaPlayer mediaPlayer new MediaPlayer();int duration 0;for (File f : files) {//筛选目标文件if (f.isFile() f.getName().endsWith(.mp3)) {try {mediaPlayer.reset();mediaPlayer.setDataSource(f.getPath());mediaPlayer.prepare();duration mediaPlayer.getDuration();} catch (IOException var5) {var5.printStackTrace();}Log.v(TAG, synLocalMusic: f.getName() - duration);AudioBean bean getAudioFileInfo(f.getPath(), f.length(), duration);list.add(bean);}}if (mediaPlayer ! null) {mediaPlayer.reset();mediaPlayer.release();}return list;}return null;}/*** 文件绝对路径校验放在外面* 文件名格式歌手 - 歌名.mp3*/private AudioBean getAudioFileInfo(String path, long size, int duration) {AudioBean songsInfo new AudioBean();//xxx/Music/歌手 - 歌名.mp3//filenameString displayName path.substring(path.lastIndexOf(/) 1);//歌手 - 歌名.mp3String album displayName.substring(0, displayName.lastIndexOf(.));//歌手 - 歌名String name;String artist;if (album.contains(-)) {artist album.substring(0, album.lastIndexOf(-)).trim();//歌手name album.substring(album.lastIndexOf(-) 1).trim();//歌名} else {artist name album;}songsInfo.setName(name);songsInfo.setDisplayName(displayName);songsInfo.setArtist(artist);songsInfo.setDuration(duration);songsInfo.setSize(size);songsInfo.setPath(path);return songsInfo;}/*** Created by Administrator on 2024/11/24.* Usage: 简单自定义音频文件bean类*/public class AudioBean implements Serializable {private String name;//歌名private String displayName;//显示名文件名去后缀private String artist;//歌手名private String path;//文件路径private int duration;//时长private long size;//文件大小public AudioBean() {}public AudioBean(String path) {//this.path path;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getDisplayName() {return displayName;}public void setDisplayName(String displayName) {this.displayName displayName;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist artist;}public String getPath() {return path;}public void setPath(String path) {this.path path;}public int getDuration() {return duration;}public void setDuration(int duration) {this.duration duration;}public long getSize() {return size;}public void setSize(long size) {this.size size;}Overridepublic String toString() {return AudioBean{ name name \ , displayName displayName \ , artist artist \ , path path \ , duration duration , size size };} }模块二播放管理器 VMPlayer.java (主要类) import android.annotation.SuppressLint; import android.content.Context; import android.media.MediaPlayer; import android.os.Handler; import android.text.TextUtils; import android.util.Log;import com.nepalese.harinetest.config.ShareDao; import com.nepalese.harinetest.utils.MathUtil;import java.io.IOException; import java.util.ArrayList; import java.util.List;/*** Created by Administrator on 2024/11/25.* Usage: virgo music player* 1. 播放模式单曲、列表循环、列表随机* 2. 后台播放单例模式* 3. 多位置同步状态回调*/ public class VMPlayer implements MediaPlayer.OnCompletionListener, VirgoPlayerCallback {private static final String TAG VMPlayer;private static final long INTERVAL_GET_PROGRESS 500;//后台获取进度频率//播放器状态public static final int STATE_ERROR -1; //错误状态需要重置列表才能继续使用public static final int STATE_INITIAL 0;//初始化状态public static final int STATE_PREPARED 1;//播放列表/资源已设置public static final int STATE_PLAYING 2;public static final int STATE_PAUSE 3;//播放模式public static final int MODE_SINGLE 0;//单曲循环public static final int MODE_LOOP 1;//列表循环public static final int MODE_RANDOM 2;//列表随机SuppressLint(StaticFieldLeak)private static volatile VMPlayer instance;//单例private Context context;private MediaPlayer mediaPlayer;private ListAudioBean beanList;//当前播放列表private ListiPlayBack iPlayBacks;//已注册回调列表private AudioBean curBean;//当前在播放的音频private int curState;//当前播放状态private int curIndex;//当前播放索引private int curMode;//当前播放模式private int errTime;//播放器连续出错次数private int aimSeek;//播放前设置的进度public static VMPlayer getInstance() {if (instance null) {synchronized (VMPlayer.class) {if (instance null) {instance new VMPlayer();}}}return instance;}private VMPlayer() {beanList new ArrayList();iPlayBacks new ArrayList(5);//最多同时存在回调个数mediaPlayer new MediaPlayer();mediaPlayer.setLooping(false);mediaPlayer.setOnCompletionListener(this);}public void init(Context context) {this.context context;curState STATE_INITIAL;curMode ShareDao.getAudioMode(context);//记忆播放模式 默认列表循环 1curIndex ShareDao.getAudioIndex(context);//记忆播放位置 0errTime 0;aimSeek 0;Log.d(TAG, init: curIndex);}/*** 播放器是否可播放*/private boolean isValid() {return curState STATE_PREPARED !beanList.isEmpty();}public ListAudioBean getBeanList() {return beanList;}//仅手动导入时调用public void resetIndex() {this.curIndex 0;}Overridepublic void onCompletion(MediaPlayer mp) {if (curMode MODE_SINGLE) {//单曲循环时自动重复播放mediaPlayer.seekTo(0);mediaPlayer.start();} else {notifyComplete();}}public void playOrPause() {if (curState STATE_PLAYING) {pause();} else {play();}}/*** 播放|继续播放*/Overridepublic void play() {if (isValid()) {if (curState STATE_PAUSE) {//继续播放curState STATE_PLAYING;mediaPlayer.start();notifyStateChanged(true);} else if (curState STATE_PREPARED) {prepareAndPlay();}//正在播放...} else {Log.d(TAG, play: curState - size: beanList.size());notifyError(未设置播放列表);}}private void prepareAndPlay() {curState STATE_PREPARED;if (curIndex 0 || curIndex beanList.size()) {curIndex 0;}ShareDao.setAudioIndex(context, curIndex);Log.d(TAG, 播放: curIndex);playResource(beanList.get(curIndex));}//播放资源private void playResource(AudioBean bean) {if (bean null || TextUtils.isEmpty(bean.getPath())) {errTime;notifyStateChanged(false);if (errTime beanList.size()) {//需要重置列表才能继续使用curState STATE_ERROR;notifyError(播放列表异常);} else {//播放下一首curState STATE_PREPARED;playNext();}return;}try {mediaPlayer.reset();mediaPlayer.setDataSource(bean.getPath());//本地文件、在线链接mediaPlayer.setOnPreparedListener(mp - {notifySongChanged(bean);notifyStateChanged(true);curState STATE_PLAYING;mediaPlayer.seekTo(aimSeek);mediaPlayer.start();errTime 0;aimSeek 0;curBean bean;});mediaPlayer.prepareAsync();startTask();} catch (IOException e) {errTime;if (errTime beanList.size()) {//需要重置列表才能继续使用curState STATE_ERROR;} else {//重置状态if (beanList.size() 0) {curState STATE_PREPARED;} else {curState STATE_INITIAL;}}notifyStateChanged(false);notifyError(播放器出错 e.getMessage());}}/*** 播放当前列表指定位置** param index index*/Overridepublic void play(int index) {if (isValid()) {curIndex index;prepareAndPlay();} else {notifyError(未设置播放列表);}}/*** 临时播放某个音频文件** param bean AudioBean*/Overridepublic void play(AudioBean bean) {if (bean null) {notifyError(指定歌曲为空);return;}curState STATE_PREPARED;playResource(bean);}/*** 更换播放列表** param list 新列表* param index 开始位置默认0*/Overridepublic void play(ListAudioBean list, int index) {if (list null || list.isEmpty()) {notifyError(新列表为空);return;}curIndex index;setPlayList(list);prepareAndPlay();}/*** 上一首*/Overridepublic void playLast() {if (isValid()) {switch (curMode) {case MODE_SINGLE:break;case MODE_LOOP:if (curIndex 0) {--curIndex;} else {curIndex beanList.size() - 1;}prepareAndPlay();break;case MODE_RANDOM:curIndex MathUtil.getRandom(0, beanList.size(), curIndex);prepareAndPlay();break;}} else {notifyError(未设置播放列表);}}/*** 下一首*/Overridepublic void playNext() {if (isValid()) {switch (curMode) {case MODE_SINGLE:break;case MODE_LOOP:curIndex;prepareAndPlay();break;case MODE_RANDOM:curIndex MathUtil.getRandom(0, beanList.size(), curIndex);prepareAndPlay();break;}} else {notifyError(未设置播放列表);}}/*** 暂停播放*/Overridepublic void pause() {if (isPlaying()) {curState STATE_PAUSE;mediaPlayer.pause();notifyStateChanged(false);}}/*** 跳转播放进度** param progress p*/Overridepublic void seekTo(int progress) {if (isValid()) {if (curState STATE_PREPARED) {aimSeek 0;mediaPlayer.seekTo(progress);} else {aimSeek progress;}}}/*** 设置播放列表** param beans b*/Overridepublic void setPlayList(ListAudioBean beans) {if (beans null || beans.isEmpty()) {notifyError(新列表为空);return;}Log.d(TAG, setPlayList: beans.size());curState STATE_PREPARED;beanList.clear();beanList.addAll(beans);curBean beanList.get(curIndex);}/*** 设置播放模式外部校验** param mode m*/Overridepublic void setPlayMode(int mode) {if (mode this.curMode) {return;}this.curMode mode;ShareDao.setAudioMode(context, mode);Log.d(TAG, setPlayMode: curMode);}/*** 是否正在播放*/Overridepublic boolean isPlaying() {return isValid() mediaPlayer.isPlaying();}/*** 当前播放进度*/Overridepublic int getCurProgress() {return mediaPlayer.getCurrentPosition();}/*** 当前播放器状态*/Overridepublic int getCurState() {return curState;}Overridepublic int getCurMode() {return curMode;}/*** 获取当前播放音频信息* 可空*/Overridepublic AudioBean getCurMusic() {if (isValid()) {return curBean;}return null;}/*** 注销播放器*/Overridepublic void releasePlayer() {stopTask();if (iPlayBacks ! null) {iPlayBacks.clear();iPlayBacks null;}if (beanList ! null) {beanList.clear();beanList null;}try {if (mediaPlayer ! null) {//stop 可能会有异常if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}mediaPlayer.reset();mediaPlayer.release();mediaPlayer null;}} catch (Exception e) {//} finally {if (mediaPlayer ! null) {mediaPlayer.reset();mediaPlayer.release();mediaPlayer null;}}instance null;curState STATE_INITIAL;}/*** 注册播放器回调*/Overridepublic void registerCallback(iPlayBack callback) {iPlayBacks.add(callback);}/*** 注销播放器回调*/Overridepublic void unregisterCallback(iPlayBack callback) {iPlayBacks.remove(callback);}Overridepublic void removeCallbacks() {iPlayBacks.clear();}public void notifyListChanged() {if (iPlayBacks ! null) {for (iPlayBack callBack : iPlayBacks) {callBack.onListChange();}}}private void notifySongChanged(AudioBean bean) {if (iPlayBacks ! null) {for (iPlayBack callBack : iPlayBacks) {callBack.onChangeSong(bean);}}}private void notifyStateChanged(boolean isPlaying) {if (iPlayBacks ! null) {for (iPlayBack callback : iPlayBacks) {callback.onPlayStateChanged(isPlaying);}}}private void notifyComplete() {if (iPlayBacks ! null) {for (iPlayBack callback : iPlayBacks) {callback.onPlayCompleted();}}}private void notifyProcessChanged(int process) {if (iPlayBacks ! null) {for (iPlayBack callback : iPlayBacks) {callback.onProcessChanged(process);}}}private void notifyError(String msg) {if (iPlayBacks ! null) {for (iPlayBack callback : iPlayBacks) {callback.onPlayError(curState, msg);}}}private final Handler handler new Handler(msg - false);private final Runnable getProcessTask new Runnable() {Overridepublic void run() {handler.postDelayed(getProcessTask, INTERVAL_GET_PROGRESS);try {if (isPlaying()) {notifyProcessChanged(getCurProgress());}} catch (Throwable ignored) {}}};private void startTask() {stopTask();handler.post(getProcessTask);}private void stopTask() {handler.removeCallbacks(getProcessTask);}}VirgoPlayerCallback.java (功能接口) /*** Created by Administrator on 2024/11/24.* Usage: 音乐播放器公开接口*/ public interface VirgoPlayerCallback {//播放|继续播放void play();//播放当前列表指定位置void play(int index);//临时播放某个音频文件void play(AudioBean bean);//更换播放列表void play(ListAudioBean beanList, int index);//上一首void playLast();//下一首void playNext();//暂停播放void pause();//跳转播放进度void seekTo(int progress);//设置播放列表void setPlayList(ListAudioBean beans);//设置播放模式void setPlayMode(int mode);//是否正在播放boolean isPlaying();//当前播放进度int getCurProgress();//当前播放器状态int getCurState();//当前播放模式int getCurMode();//获取当前播放音频信息AudioBean getCurMusic();//注销播放器void releasePlayer();void registerCallback(iPlayBack callback);void unregisterCallback(iPlayBack callback);void removeCallbacks(); }iPlayBack.java(播放状态回调接口) public interface iPlayBack {//歌单变化void onListChange();void onChangeSong(NonNull AudioBean bean);//播放结束时调用void onPlayCompleted();//播放状态变化时调用播放|暂停void onPlayStateChanged(boolean isPlaying);//播放进度变化时调用void onProcessChanged(int process);//播放出错时调用void onPlayError(int state, String error); }模块三播放控件歌曲列表 VirgoSimplePlayer.java (简单音乐播放器控件) import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView;import com.nepalese.harinetest.R; import com.nepalese.harinetest.utils.ConvertUtil;/*** Created by Administrator on 2024/11/24.* Usage: 简单音乐播放器控件*/public class VirgoSimplePlayer extends RelativeLayout {private static final String TAG VirgoSimplePlayer;private SeekBar musicSeekbar;private TextView musicName, musicCur, musicAll;private ImageButton musicLast, musicPlay, musicNext, musicMode;private VMPlayer vmPlayer;public VirgoSimplePlayer(Context context) {this(context, null);}public VirgoSimplePlayer(Context context, AttributeSet attrs) {this(context, attrs, 0);}public VirgoSimplePlayer(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);LayoutInflater.from(context).inflate(R.layout.layout_simple_virgo_player, this, true);init();}private void init() {initUI();initData();setListener();}private void initUI() {musicSeekbar findViewById(R.id.music_seekbar);musicName findViewById(R.id.music_tv_name);musicCur findViewById(R.id.music_cur);musicAll findViewById(R.id.music_all);musicLast findViewById(R.id.music_btn_last);musicPlay findViewById(R.id.music_btn_paly);musicNext findViewById(R.id.music_btn_next);musicMode findViewById(R.id.music_btn_mode);musicName.setSelected(true);}private void initData() {vmPlayer VMPlayer.getInstance();}private void setListener() {musicLast.setOnClickListener(v - vmPlayer.playLast());musicNext.setOnClickListener(v - vmPlayer.playNext());musicPlay.setOnClickListener(v - vmPlayer.playOrPause());musicMode.setOnClickListener(v - changPlayMode());musicSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//拖动进度条控制播放进度vmPlayer.seekTo(seekBar.getProgress());}});}private void changPlayMode() {int curMode vmPlayer.getCurMode();curMode;if (curMode VMPlayer.MODE_RANDOM) {curMode VMPlayer.MODE_SINGLE;}vmPlayer.setPlayMode(curMode);updateModeImg(curMode);}private void updateModeImg(int curMode) {switch (curMode) {case VMPlayer.MODE_SINGLE:musicMode.setImageResource(R.mipmap.icon_single);break;case VMPlayer.MODE_LOOP:musicMode.setImageResource(R.mipmap.icon_order);break;case VMPlayer.MODE_RANDOM:musicMode.setImageResource(R.mipmap.icon_random);break;}}public void notifyStateChanged(boolean isPlaying) {if (isPlaying) {musicPlay.setImageResource(R.mipmap.icon_playing);} else {musicPlay.setImageResource(R.mipmap.icon_pause);}}public void notifyProcessChanged(int process) {musicSeekbar.setProgress(process);musicCur.setText(ConvertUtil.formatTime(process));}public void notifySongChanged(String name, int duration) {musicName.setText(name);musicSeekbar.setMax(duration);musicAll.setText(ConvertUtil.formatTime(duration));}public void synInfo() {//重新进入时如果在播放则需同步一下歌曲信息if (vmPlayer.isPlaying()) {AudioBean bean vmPlayer.getCurMusic();notifySongChanged(bean.getName() - bean.getArtist(), bean.getDuration());notifyStateChanged(true);}else{//自动播放vmPlayer.play();}//同步播放模式updateModeImg(vmPlayer.getCurMode());} }layout_simple_virgo_player.xml ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:gravitycenter_verticalandroid:padding15dpandroid:orientationhorizontalandroid:backgrounddrawable/bg_card_redImageViewandroid:layout_widthdimen/player_img_sizeandroid:layout_heightdimen/player_img_sizeandroid:srcmipmap/img_cover_defaultandroid:scaleTypecenterCrop/LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalandroid:layout_marginStart10dpLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_gravitycenter_verticalandroid:orientationverticalTextViewandroid:idid/music_tv_nameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_gravityleftandroid:singleLinetrueandroid:ellipsizemarqueeandroid:marqueeRepeatLimitmarquee_foreverandroid:text歌名android:textSizedimen/text_size_14android:textColorcolor/blackandroid:paddingStart15dp/SeekBarandroid:idid/music_seekbarandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:progressTintcolor/blackandroid:thumbTintcolor/color_QYHandroid:layout_marginTop3dpandroid:progress0//LinearLayoutRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentLinearLayoutandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerVerticaltrueandroid:layout_marginLeft5dpandroid:orientationhorizontalTextViewandroid:idid/music_curandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text00android:textColorcolor/whiteandroid:textSizedimen/text_size_12/TextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text/android:textColorcolor/whiteandroid:textSizedimen/text_size_12/TextViewandroid:idid/music_allandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text00android:textColorcolor/whiteandroid:textSizedimen/text_size_12//LinearLayoutLinearLayoutandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerInParenttrueandroid:gravitycenterandroid:orientationhorizontalImageButtonandroid:idid/music_btn_lastandroid:layout_widthdimen/player_icon_size_smallandroid:layout_heightdimen/player_icon_size_smallandroid:layout_margindimen/player_icon_marginandroid:backgrounddrawable/img_button_transprantandroid:srcmipmap/icon_lastandroid:scaleTypecenterCrop/ImageButtonandroid:idid/music_btn_palyandroid:layout_widthdimen/player_icon_size_bigandroid:layout_heightdimen/player_icon_size_bigandroid:backgrounddrawable/img_button_transprantandroid:srcmipmap/icon_pauseandroid:scaleTypecenterCrop/ImageButtonandroid:idid/music_btn_nextandroid:layout_widthdimen/player_icon_size_smallandroid:layout_heightdimen/player_icon_size_smallandroid:layout_margindimen/player_icon_marginandroid:backgrounddrawable/img_button_transprantandroid:srcmipmap/icon_nextandroid:scaleTypecenterCrop//LinearLayoutLinearLayoutandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerVerticaltrueandroid:layout_alignParentEndtrueImageButtonandroid:idid/music_btn_modeandroid:layout_widthdimen/player_icon_size_smallandroid:layout_heightdimen/player_icon_size_smallandroid:layout_margindimen/player_icon_marginandroid:backgrounddrawable/img_button_transprantandroid:srcmipmap/icon_orderandroid:scaleTypecenterCrop//LinearLayout/RelativeLayout/LinearLayout /LinearLayout!--dimens.xml-- dimen nameplayer_icon_size_big42dp/dimen dimen nameplayer_icon_size_small30dp/dimen dimen nameplayer_icon_margin10dp/dimen dimen nameplayer_layout_padding10dp/dimen dimen nameplayer_img_size85dp/dimen!--text size sp-- dimen nametext_size_1010sp/dimen dimen nametext_size_1212sp/dimen dimen nametext_size_1414sp/dimen dimen nametext_size_1616sp/dimen dimen nametext_size_1818sp/dimen dimen nametext_size_2020sp/dimen dimen nametext_size_2222sp/dimen dimen nametext_size_2424sp/dimen dimen nametext_size_3232sp/dimen dimen nametext_size_5050sp/dimendimen namepadding_11dp/dimen dimen namepadding_22dp/dimen dimen namepadding_33dp/dimen dimen namepadding_55dp/dimen dimen namepadding_1010dp/dimen dimen namepadding_1515dp/dimendimen namemargin_11dp/dimen dimen namemargin_33dp/dimen dimen namemargin_55dp/dimen dimen namemargin_1010dp/dimen dimen namemargin_1515dp/dimenListView_LocalSong_Adapter.java(自定义列表适配器) import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView;import com.nepalese.harinetest.R;import java.util.List;/*** author nepalese on 2024/11/24* usage*/ public class ListView_LocalSong_Adapter extends BaseAdapter {private Context context;private LayoutInflater inflater;private ListAudioBean data;private interListenerSongList listener;public ListView_LocalSong_Adapter(Context context, interListenerSongList listener, ListAudioBean list) {this.context context;this.inflater LayoutInflater.from(context);this.listener listener;this.data list;}Overridepublic int getCount() {return data null ? 0 : data.size();}Overridepublic Object getItem(int position) {return null;}Overridepublic long getItemId(int position) {return position;}static class Holder {private TextView tvOrder, tvName, tvArtist;private LinearLayout root;private ImageButton ibList;}Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder;if (convertView null) {holder new Holder();convertView inflater.inflate(R.layout.layout_song_list_local, null);holder.root convertView.findViewById(R.id.layout_list_root);holder.tvOrder convertView.findViewById(R.id.tv_order);holder.tvName convertView.findViewById(R.id.tvLocalName);holder.tvArtist convertView.findViewById(R.id.tvLocalArtist);holder.ibList convertView.findViewById(R.id.ibLocalSongList);convertView.setTag(holder);} else {holder (Holder) convertView.getTag();}holder.tvOrder.setText(String.valueOf(position 1));holder.tvName.setText(data.get(position).getName());holder.tvArtist.setText(data.get(position).getArtist());if (position % 2 0) {holder.root.setBackgroundColor(Color.parseColor(#4D03A9F4));}else{holder.root.setBackgroundColor(Color.TRANSPARENT);}if (VMPlayer.getInstance().getCurState() VMPlayer.STATE_PREPARED VMPlayer.getInstance().getCurMusic().getDisplayName().equals(data.get(position).getDisplayName())) {holder.tvName.setTextColor(Color.RED);} else {holder.tvName.setTextColor(Color.BLACK);}//内部项点击监听 // holder.ibList.setOnClickListener(v - { // listener.onItemClick(v); // });holder.ibList.setTag(position);return convertView;}public interface interListenerSongList {void onItemClick(View view);} }layout_song_list_local.xml ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idid/layout_list_rootandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:paddingdimen/padding_5android:gravitycenter_verticalandroid:descendantFocusabilityblocksDescendantsandroid:orientationhorizontalTextViewandroid:idid/tv_orderandroid:layout_margindimen/margin_5android:layout_width35dpandroid:layout_heightwrap_contentandroid:gravitycenterandroid:textSizedimen/text_size_18android:textColorcolor/black /LinearLayoutandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:layout_weight1android:orientationverticalTextViewandroid:idid/tvLocalNameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:singleLinetrueandroid:ellipsizeendandroid:layout_marginBottomdimen/margin_3android:textColorcolor/blackandroid:textSizedimen/text_size_18/TextViewandroid:idid/tvLocalArtistandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:singleLinetrueandroid:ellipsizeendandroid:textColorcolor/grayandroid:textSizedimen/text_size_14//LinearLayoutImageButtonandroid:idid/ibLocalSongListandroid:layout_widthdimen/icon_30android:layout_heightdimen/icon_30android:srcmipmap/icon_list_grayandroid:scaleTypefitCenterandroid:paddingdimen/padding_2android:focusablefalseandroid:backgrounddrawable/selector_button_transparent/ /LinearLayout前端使用 public class AudioPlayActivity extends AppCompatActivity implements ListView_LocalSong_Adapter.interListenerSongList, iPlayBack {private static final String TAG AudioPlayActivity;private Context context;private VirgoSimplePlayer simplePlayer;private ListView listView;private ListView_LocalSong_Adapter adapter;private final ListAudioBean audioList new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_audio_play);context getApplicationContext();init();}private void init() {initUI();initData();setListener();}private void initUI() {simplePlayer findViewById(R.id.simplePlayer);listView findViewById(R.id.listviewAudio);}private void initData() {VMPlayer.getInstance().registerCallback(this);simplePlayer.synInfo();audioList.addAll(VMPlayer.getInstance().getBeanList());adapter new ListView_LocalSong_Adapter(context, this, audioList);listView.setAdapter(adapter);}private void setListener() {listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {Overridepublic void onItemClick(AdapterView? parent, View view, int position, long id) {VMPlayer.getInstance().play(position);}});}Overrideprotected void onDestroy() {release();super.onDestroy();}private void release() {VMPlayer.getInstance().unregisterCallback(this);}Overridepublic void onItemClick(View view) {//}Overridepublic void onListChange() {audioList.clear();audioList.addAll(VMPlayer.getInstance().getBeanList());updateListView();}//Overridepublic void onChangeSong(NonNull AudioBean bean) {if (simplePlayer ! null) {simplePlayer.notifySongChanged(bean.getName() - bean.getArtist(), bean.getDuration());}//刷新列表updateListView();}Overridepublic void onPlayCompleted() {//自动播放下一首VMPlayer.getInstance().playNext();}Overridepublic void onPlayStateChanged(boolean isPlaying) {if (simplePlayer ! null) {simplePlayer.notifyStateChanged(isPlaying);}}Overridepublic void onProcessChanged(int process) {if (simplePlayer ! null) {simplePlayer.notifyProcessChanged(process);}}Overridepublic void onPlayError(int state, String error) { // Toast.makeText(context, error, Toast.LENGTH_LONG).show();Log.d(TAG, onPlayError: error);}private final int MSG_UPDATE_LIST 1;private void updateListView(){handler.sendEmptyMessage(MSG_UPDATE_LIST);}private final Handler handler new Handler(new Handler.Callback() {Overridepublic boolean handleMessage(NonNull Message msg) {if(msg.what MSG_UPDATE_LIST){if (adapter ! null) {adapter.notifyDataSetChanged();}}return false;}}); }?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticaltools:context.AudioPlayActivityListViewandroid:idid/listviewAudioandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_weight1android:dividercolor/whiteandroid:dividerHeight0dp /com.nepalese.harinetest.musicplayer.VirgoSimplePlayerandroid:idid/simplePlayerandroid:layout_widthmatch_parentandroid:layout_heightwrap_content//LinearLayout
http://www.dnsts.com.cn/news/47335.html

相关文章:

  • 怎么做百度采购网站吉林省吉林市龙潭区
  • 做网站需要编程吗研究院 网站建设
  • 广州有哪些网站建设品牌宝网站认证
  • 网站修改备案号站长之家ppt模板
  • 在百度做推广需要网站吗win2008r2 iis配置网站
  • 好的网站收入购物网站做推广
  • 网站基础内容注册百度网站怎么弄
  • 网站综合开发怎么做厚街网站建设多少钱
  • 网站gif素材o2o网站建设方案
  • 有没有做问卷还能赚钱的网站nas可以做网站服务器吗
  • 电商网站建设基础ppt接私活做网站要不要签合同
  • 手机电子商务网站建设华为商城网站建设
  • 做电商网站需要注册什么公司名称标书制作图片
  • 做水果的有什么网站好主题资源网站制作平台
  • ps做营销型网站布局建网站公司 优帮云
  • 吉林网站建设代理渠道南通给公司做网站的
  • 网站推广的宣传途径网站 文章排版
  • 个人网站怎么制作成图片微网站开发视频教程
  • 阿里云建站数据库用什么一个专做窗帘的网站
  • 北京南站在哪个区哪个街道广宏建设集团有限公司网站
  • 有没有国外的做美食的视频网站做网站费用
  • 网站内部链接的策略有小型购物网站建设
  • 有没有大人和小孩做的网站什么软件能自己做网站
  • 网站策划书格式怎么自己做推广网站
  • 免费做网站公司推荐品牌营销策划书模板
  • 网站建设公司哪家好天水建设局网站渣土治理
  • 蚌埠建设网站公司wordpress亿起发
  • 如何建立电子商务网站构建一个网站需要多少钱
  • 怎样在设计网站做图赚钱中铁建设集团门户网登
  • 房屋在线设计网站企业网站优化搜行者seo