-
Notifications
You must be signed in to change notification settings - Fork 18
/
MainActivity.kt
102 lines (87 loc) · 4.93 KB
/
MainActivity.kt
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
package space.siy.waveformviewdemo
import android.media.MediaPlayer
import android.os.Bundle
import android.os.Handler
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.SeekBar
import kotlinx.android.synthetic.main.activity_main.*
import space.siy.waveformview.WaveFormData
import space.siy.waveformview.WaveFormView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Open From Assets Folder
val afd = assets.openFd("jazz_in_paris.mp3")
//Build WaveFormData
WaveFormData.Factory(afd.fileDescriptor, afd.startOffset, afd.length)
.build(object : WaveFormData.Factory.Callback {
//When Complete, you can receive data and set to the view
override fun onComplete(waveFormData: WaveFormData) {
progressBar.visibility = View.GONE
waveFormView.data = waveFormData
//UI setup
seekBar1.progress = (waveFormView.secPerBlock*100f).toInt()
seekBar2.progress = (waveFormView.blockWidth).toInt()
seekBar3.progress = (waveFormView.topBlockScale*100f).toInt()
seekBar4.progress = (waveFormView.bottomBlockScale*100f).toInt()
seekBar1.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
waveFormView.secPerBlock = seekBar.progress / 100f
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
seekBar2.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
waveFormView.blockWidth = seekBar.progress.toFloat()
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
seekBar3.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
waveFormView.topBlockScale = seekBar.progress / 100f
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
seekBar4.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
waveFormView.bottomBlockScale = seekBar.progress / 100f
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
//Initialize MediaPlayer
val player = MediaPlayer()
player.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
player.prepare()
player.start()
//Synchronize with MediaPlayer using WaveFormView.Callback
waveFormView.callback = object : WaveFormView.Callback {
override fun onPlayPause() {
if (player.isPlaying)
player.pause()
else
player.start()
}
override fun onSeek(pos: Long) {
player.seekTo(pos.toInt())
}
}
//You have to notify current position to the view
Handler().postDelayed(object : Runnable {
override fun run() {
waveFormView.position = player.currentPosition.toLong()
Handler().postDelayed(this, 20)
}
}, 20)
}
override fun onProgress(progress: Float) {
progressBar.progress = (progress*10).toInt()
}
})
}
}