@@ -6,6 +6,7 @@ import android.graphics.Bitmap
66import android.graphics.Canvas
77import android.graphics.Color
88import android.util.AttributeSet
9+ import android.view.MotionEvent
910import android.view.View
1011import android.view.animation.OvershootInterpolator
1112
@@ -21,6 +22,14 @@ class AudioWaveView : View {
2122 inflateAttrs(attrs)
2223 }
2324
25+ var onProgressListener: OnProgressListener ? = null
26+
27+ var onProgressChanged: (Float , Boolean ) -> Unit = { progress, byUser -> Unit }
28+
29+ var onStartTracking: (Float ) -> Unit = {}
30+
31+ var onStopTracking: (Float ) -> Unit = {}
32+
2433 var chunkHeight: Int = 0
2534 get() = if (field == 0 ) h else Math .abs(field)
2635 set(value) {
@@ -64,6 +73,10 @@ class AudioWaveView : View {
6473 require(value in 0 .. 100 ) { " Progress must be in 0..100" }
6574
6675 field = Math .abs(value)
76+
77+ onProgressListener?.onProgressChanged(field, isTouched)
78+ onProgressChanged(field, isTouched)
79+
6780 postInvalidate()
6881 }
6982
@@ -85,6 +98,8 @@ class AudioWaveView : View {
8598 field = Math .max(400 , value)
8699 }
87100
101+ var isTouched = false
102+
88103 private val chunksCount: Int
89104 get() = w / chunkStep
90105
@@ -150,6 +165,45 @@ class AudioWaveView : View {
150165 super .onLayout(changed, left, top, right, bottom)
151166 }
152167
168+ override fun onTouchEvent (event : MotionEvent ? ): Boolean {
169+ event ? : return super .onTouchEvent(event)
170+
171+ when (event.action) {
172+ MotionEvent .ACTION_DOWN -> {
173+ isTouched = true
174+ progress = event.toProgress()
175+
176+ // these paired calls look ugly, but we need them for Java
177+ onProgressListener?.onStartTracking(progress)
178+ onStartTracking(progress)
179+
180+ return true
181+ }
182+ MotionEvent .ACTION_MOVE -> {
183+ isTouched = true
184+ progress = event.toProgress()
185+ return true
186+ }
187+ MotionEvent .ACTION_UP -> {
188+ isTouched = false
189+ onProgressListener?.onStopTracking(progress)
190+ onStopTracking(progress)
191+ return false
192+ }
193+ else -> {
194+ isTouched = false
195+ return super .onTouchEvent(event)
196+ }
197+ }
198+ }
199+
200+ fun MotionEvent.toProgress () = this @toProgress.x.clamp(0F , w.toFloat()) / w * 100F
201+
202+ // Java convenience
203+ fun setRawData (raw : ByteArray , callback : OnSamplingListener ) {
204+ setRawData(raw) { callback.onComplete() }
205+ }
206+
153207 @JvmOverloads
154208 fun setRawData (raw : ByteArray , callback : () -> Unit = {}) {
155209 MAIN_THREAD .postDelayed({
0 commit comments