SeekBar

SeekBar播放进度条,我们使用SeekBar时,可以使用系统自带的样式,当然也可以自定义

自定义的SeekBar进度条样式 是layer_list标签

这里我写了一个播放本地音乐的的SeekBar

效果图:


以下是具体实现代码:代码中有注释

MainActivity:在本地获取音乐

public class MainActivity extends AppCompatActivity {
    ContentResolver resolver;
    ArrayList<MusicContent> arrayList;
    ListView lv;
    private MusicAdapter musicAdapter;
    MyApplication app;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        lv = (ListView) findViewById(R.id.lv_music);
        app= (MyApplication) getApplication();
        arrayList = new ArrayList<>();
        resolver = getContentResolver();
        init();

    }

    private void init() {
        /**
         * 参数一:Uri uri
         * 参数二:String[] projection  列名
         * 参数三:String selection 查询条件
         * 参数四:String[] selectionArgs  查询条件的值
         * 参数五:String sortOrder 排序
         */
        Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String title = cursor.getString(cursor.getColumnIndex("title"));
                String _data = cursor.getString(cursor.getColumnIndex("_data"));
                arrayList.add(new MusicContent(title, _data));
            }
            app.arrayList_music.addAll(arrayList);
        }
        musicAdapter = new MusicAdapter(this, arrayList);
        lv.setAdapter(musicAdapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(MainActivity.this, Activity_Sing.class);
                intent.putExtra("title", arrayList.get(position).getTitle().toString());
                intent.putExtra("_data", arrayList.get(position).get_data().toString());
                startActivity(intent);
            }
        });
    }

}
Activity_Sing

整个播放流程
          1.点击播放  再次点击按钮 暂停播放
          2.设置时间为S
          3.新建一个名字为utils包
          4.在utils下创建一个OtherUtils的类
          5.创建Timer定时器,让进度条跟着音乐的播放而向前移动


public class Activity_Sing extends Activity {
    TextView tv_sing,text_now_time,text_total_time;
    Button but_bo,but_newMusic;
    Intent intent;
    String _data;
    private MediaPlayer mp;
    SeekBar seekBar;
    Boolean isPlaying=false;
    Timer timer;
    MyApplication app;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sing);
        app= (MyApplication) getApplication();
        intent = getIntent();
        tv_sing = (TextView) findViewById(R.id.tv_sing);
        tv_sing.setText(intent.getStringExtra("title"));
        /**拿到路径进行播放*/
        _data = intent.getStringExtra("_data");
        /**创建MediaPlayer对象*/
        mp = new MediaPlayer();
        try {
            mp.setDataSource(_data);//设置播放源
            mp.prepare();//准备
        } catch (IOException e) {
            e.printStackTrace();
        }
        initView();
        /**监听seekBar拖动进度条确定播放的进度*/
       seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            /**停止拖动时响应*/
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mp.seekTo(seekBar.getProgress());//设置对应进度条的音乐进度  Progress进度条的进度
            }
        });
        /**播放完成后自动播放下一首*/
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                nextMusic();
            }
        });
    }

    private void initView() {
        but_newMusic= (Button) findViewById(R.id.but_nextMusic);
        but_newMusic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**播放下一曲*/
                nextMusic();
            }
        });
        text_now_time= (TextView) findViewById(R.id.text_now_time);
        text_total_time= (TextView) findViewById(R.id.text_total_time);
        seekBar = (SeekBar) findViewById(R.id.seekBar);
        but_bo = (Button) findViewById(R.id.but_bo);
        but_bo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**如果isPlaying=true  正在播放  按下按钮后  暂停
                 * 如果isPlaying=false  正在暂停  按下按钮后播放  */
                if(!isPlaying){
                but_bo.setText("暂停");
                        /**注意:直接通过getDuration()获取总时长,一定要等它准备好了才调用这个方法*/
                        seekBar.setMax(mp.getDuration());//设置最大时长
                        text_total_time.setText(OtherUtils.msToS(mp.getDuration()));//获取总时长
                        /**定时器Timer
                         * 1.创建定时器对象
                         * 2.规定任务*/
                        timer=new Timer();
                        /**
                         * 每隔一秒设置一个seekBar的进度,刷新播放的时间
                         *Timer Task task:任务
                         * Date firstTime:多少秒后开启定时器
                         *long period 每隔多少秒执行依次
                         */
                        TimerTask timerTask=new TimerTask() {
                        @Override
                        public void run() {
                            /**设置seekBar的进度
                             * 1.通过MediaPlayer获取当前歌曲的进度
                             * 2.通过seekBar的setProgress设置
                             * seekBar更新进度不算刷新UI*/
                            final int index= mp.getCurrentPosition();
                            seekBar.setProgress(index);
                            /**刷新UI*/
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    text_now_time.setText(OtherUtils.msToS(index));
                                }
                            });
                        }
                    };
                    timer.schedule(timerTask,0,1000);
                    mp.start();//开始

                    isPlaying=true;
                }else{
                    but_bo.setText("播放");
                    mp.pause();//暂停
                    isPlaying=false;
                }

            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mp.stop();//停止
        mp.release();//释放资源
        mp=null;
    }
    /**随机播放*/
    public void nextMusic(){
//        mp.stop();//停止上一首歌
//        mp.release();//释放资源
        mp.reset();//将MediaPlayer回到最初状态
        /**
         * 怎么拿到要播放的歌:
         * 需要总的集合
         * 方式1.将集合定义为static
         * 方式2.通过Application来管理集合(Application管理整个工程里面共用的资源)*/
        //随机产生int值
        int index=new Random().nextInt(app.arrayList_music.size());
                try {  mp.setDataSource(app.arrayList_music.get(index).get_data());//设置下一首随机播放的歌曲
                mp.prepare();//准备
                seekBar.setMax(mp.getDuration());//设置最大时长
                mp.start();//开始
                tv_sing.setText(app.arrayList_music.get(index).getTitle());//更改当前的歌名
                text_total_time.setText(OtherUtils.msToS(mp.getDuration()));//更改总时长
        } catch (IOException e) {
            e.printStackTrace();
    }   }
}
OtherUtils:

public class OtherUtils {
    /**毫秒转分钟*/
    public static String msToS(int ms) {
        if(ms/1000%60<10){
            return ms/1000/60+":0"+ms/1000%60;
        }else{
            return ms/1000/60+":"+ms/1000%60;
        }

    }
}
MyApplication:

这个自定义MyApplication类,可以拿到对象里面所需要的方法

/**
 * 在AndroidManifest中的application中添加一个属性
 *android:name=".app.MyApplication"
 */

public class MyApplication extends Application {
    /**管理音乐的集合*/
   public ArrayList<MusicContent> arrayList_music;
    @Override
    public void onCreate() {
        super.onCreate();
        arrayList_music=new ArrayList<>();
    }

}
MusicAdapter:

public class MusicAdapter extends BaseAdapter {
    Context context;
    LayoutInflater mInflater;
    ArrayList<MusicContent> arrayList;

    public MusicAdapter(Context context, ArrayList<MusicContent> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return arrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return arrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.activity_main, null);
            viewHolder = new ViewHolder();
            viewHolder.tv_musicSing= (TextView) convertView.findViewById(R.id.tv_musicSing);
            viewHolder.tv_number= (TextView) convertView.findViewById(R.id.tv_number);
            convertView.setTag(viewHolder);
        }
        viewHolder = (ViewHolder) convertView.getTag();
        MusicContent musicContent = (MusicContent) getItem(position);
        viewHolder.tv_musicSing.setText(musicContent.getTitle());
        viewHolder.tv_number.setText(musicContent.get_data());
        return convertView;
    }
}

class ViewHolder {
    TextView tv_musicSing,tv_number;
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape_music"
            >
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginLeft="10dp"
                android:layout_weight="0.4"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                    <TextView
                        android:id="@+id/tv_musicSing"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_gravity="center"
                        android:gravity="bottom"
                        android:textSize="10sp" />
                </LinearLayout>
                <TextView
                    android:id="@+id/tv_number"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_weight="0.5"
                    android:textSize="10sp" />
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>



activity_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e0ffff"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/listView_iv"
            android:layout_width="20dp"
            android:layout_height="30dp"
            android:layout_marginLeft="10dp"
            android:background="@mipmap/xiaoyu"
            android:gravity="center" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="歌手"
            android:textColor="#ff6c67"
            android:textSize="25sp" />
    </LinearLayout>

    <ListView
        android:id="@+id/lv_music"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>
activity_sing.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/tv_sing"
        android:layout_marginLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
       />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="10dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@drawable/shape_music"
        >

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_weight="0.4"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/tv_music"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:gravity="bottom"
                    android:textSize="10sp" />
            </LinearLayout>

            <TextView
                android:id="@+id/tv_Sing"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="0.5"
                android:textSize="10sp" />
        </LinearLayout>

    </LinearLayout>
    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/text_now_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"
            android:textSize="20sp"
            android:layout_marginLeft="20dp"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/text_total_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2"
            android:textSize="20sp"
            android:layout_marginRight="20dp"
            />
    </LinearLayout>

    <Button
        android:id="@+id/but_bo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放" />
    <Button
        android:id="@+id/but_nextMusic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="随机播放" />
</LinearLayout>
shape_music.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp"/>
    <solid android:color="#ffcccc"/>
</shape>

这样这个程序就完成了,如果大家还有更好的建议,可以分享一下哟(^U^)ノ~YO



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值