Android:postDelayed(模拟音乐播放进度模块)

简介:

postDelayed的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
     /**
      * 音乐播放模块
      */
     private  ImageButton imageButton;
     private  ProgressBar progressBar;
     private  TextView textView;
     private  boolean  isPlay =  false ;
                     
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                         
         imageButton = (ImageButton) findViewById(R.id.imageButton1);
         progressBar = (ProgressBar) findViewById(R.id.progressBar1);
         textView = (TextView) findViewById(R.id.textView1);
                         
         imageButton.setOnClickListener( this );
     }
                     
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
                     
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
         case  R.id.imageButton1:
             imgClick();
             break ;
                         
         default :
             break ;
         }
     }
                     
     private  void  imgClick()
     {
         isPlay = !isPlay;
         if (isPlay) //更换播放按钮图片
         {
             imageButton.setImageResource(R.drawable.ic_pause);
             play(); //调用播放方法
         }
         else
         {
             imageButton.setImageResource(R.drawable.ic_play);
         }
     }
                     
     private  int  playTime;
     private  Runnable action =  null ;
                     
     private  void  play()
     {
         new  Thread()
         {
             public  void  run()
             {
                                 
                 //使用postDelayed定时发送消息
                 action =  new  Runnable() // 创建action时并不执行run()方法
                 {
                     @Override
                     public  void  run()
                     {
                         if (isPlay)
                         {
                             playTime++;
                             textView.setText(playTime +  "" );
                             imageButton.postDelayed(action,  1000 ); // 回调action
                             progressBar.setProgress(playTime);
                         }
                     }
                 };
                 imageButton.postDelayed(action,  0 ); // 创建action后执行此方法,回调Runnable()里的run方法
                             
                                 
             };
         }.start();
     }
}



模拟音乐播放计时和进度条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
public  class  MainActivity  extends  Activity  implements  OnClickListener,
         OnSeekBarChangeListener
{
     private  ImageButton imageButton;
     private  SeekBar seekBar;
     private  TextView textView_playtime;
     private  boolean  isPlay =  false ;
     private  Chronometer mTimer;
     private  TextView textView_lasttime;
     private  long  firstClickTime =  0 ;
          
          
          
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
              
         imageButton = (ImageButton) findViewById(R.id.imageButton1);
         seekBar = (SeekBar) findViewById(R.id.seekBar1);
         textView_playtime = (TextView) findViewById(R.id.textView_playtime);
         textView_lasttime = (TextView) findViewById(R.id.textView_lasttime);
         mTimer = (Chronometer) findViewById(R.id.chronometer1);
              
         imageButton.setOnClickListener( this );
         seekBar.setOnSeekBarChangeListener( this );
         seekBar.setMax(lastTime());
     }
          
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
          
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
             case  R.id.imageButton1:
                 imgClick();
                 break ;
                  
             default :
                 break ;
         }
     }
          
     private  void  imgClick()
     {
         //用户点击间隔在1秒之内,就不响应(不再启动新线程,避免连续点击的加速问题)
         long  secondClickTime = System.currentTimeMillis();
         if (secondClickTime - firstClickTime <  1000 )
         {
             return ;
         }
         firstClickTime = System.currentTimeMillis();
              
         isPlay = !isPlay;
         if  (isPlay) // 更换播放按钮图片
         {
             imageButton.setImageResource(R.drawable.ic_play);
             play(); // 调用播放方法
         }
         else
         {
             imageButton.setImageResource(R.drawable.ic_pause);
         }
     }
          
     private  int  playTime;
     private  Runnable action =  null ;
          
     private  void  play()  // 播放音乐
     {
         new  Thread()
         {
             public  void  run()
             {
                 action =  new  Runnable()
                 {
                     @Override
                     public  void  run()
                     {
                              
                         if  (isPlay)
                         {
                             if  (playTime > lastTime())
                             {
                                 prostop();
                             }
                             else
                             {
                                 textView_playtime.setText(progresstime(playTime));
                                 seekBar.setProgress(playTime);
                                 imageButton.postDelayed(action,  1000 );
                                 playTime +=  1000 ;
                             }
                         }
                     }
                 };
                 imageButton.postDelayed(action,  0 );
             };
         }.start();
     }
          
     private  void  prostop() //播放结束
     {
         new  Thread()
         {
             @Override
             public  void  run()
             {
                 Runnable actionStop =  new  Runnable()
                 {
                     @Override
                     public  void  run()
                     {
                         imageButton.setImageResource(R.drawable.ic_pause);
                         isPlay =  false ;
                         playTime =  0 ;
                         seekBar.setProgress(playTime);
                     }
                 };
                 imageButton.post(actionStop);
             }
         }.start();
     }
          
     // 得到结束时间的毫秒数
     private  int  lastTime()
     {
         String[] str = textView_lasttime.getText().toString().split( ":" );
         return  (Integer.parseInt(str[ 1 ]) + Integer.parseInt(str[ 0 ]) *  60 ) *  1000 ;
     }
          
     // 监听进度条方法
     @Override
     public  void  onProgressChanged(SeekBar seekBar,  int  progress,
             boolean  fromUser)
     {
         playTime = progress;
     }
          
     @Override
     public  void  onStartTrackingTouch(SeekBar seekBar)
     {
              
     }
          
     @Override
     public  void  onStopTrackingTouch(SeekBar seekBar)
     {
              
     }
          
     // 将毫秒数转换为时间格式
     private  String progresstime( int  progress)
     {
         Date date =  new  Date(progress);
         SimpleDateFormat format =  new  SimpleDateFormat( "mm:ss" );
         return  format.format(date);
     }
          
}








本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1206266,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
6月前
|
XML 存储 数据库
如何使用Android Studio创建一个基本的音乐播放器应用
如何使用Android Studio创建一个基本的音乐播放器应用
256 0
|
4月前
|
Android开发
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
28 0
Android 利用MediaPlayer实现音乐播放
|
4月前
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
100 5
|
4月前
|
编解码 网络协议 vr&ar
Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流
这段内容讲述了VR头显中实现高分辨率视频播放的技术背景与实现方法,并强调了其重要性。高分辨率对于提升VR体验至关重要,它能提供更清晰的画面、增强沉浸感、补偿透镜放大效应,并维持宽广视场角下的图像质量。文中提到的大牛直播SDK具备极低的延迟(200-400ms),支持多种协议与格式,并具有丰富的功能特性,如多实例播放、事件回调、视频及音频格式支持等。此外,提供了基于Unity的播放器示例代码,展示了如何配置播放参数并开始播放。最后,作者指出此类技术在远程控制、虚拟仿真等应用场景中的重要意义。
|
4月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
4月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
4月前
|
监控 Java 开发工具
如何快速对接Android平台GB28181接入模块(SmartGBD)
大牛直播SDK推出的Android平台GB28181接入SDK(SmartGBD),可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景,可能是业内为数不多功能齐全性能优异的商业级水准GB28181接入SDK。
|
4月前
|
编解码 开发工具 Android开发
Android平台RTMP直播推送模块技术接入说明
大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能优异,配合大牛直播SDK的SmartPlayer播放器,轻松实现毫秒级的延迟体验,满足大多数行业的使用场景。RTMP直播推送模块数据源,支持编码前、编码后数据对接
|
4月前
|
监控 开发工具 Android开发
结合GB/T28181规范探讨Android平台设备接入模块心跳实现
本文介绍了GB28181标准中的状态信息报送机制,即心跳机制,用于监控设备与服务器间的连接状态。根据国标GB/T28181-2016,设备在异常时需立即发送状态信息,在正常状态下则按固定间隔(默认60秒)定期发送。若连续三次(默认值)未收到心跳,则视为离线。文章展示了在Android平台的GB28181设备接入模块(SmartGBD)中,如何调整心跳间隔为20秒及超时次数为3次,并给出了心跳消息的示例和异常处理代码片段。对于希望深入了解或遇到问题的开发者,作者提供了进一步交流的机会。