Add seek preview thumbnails

Learn how to show spritesheet-based thumbnail previews during seek bar scrubbing in the FastPix Android Player.

Seek preview shows thumbnail previews while the user scrubs the seek bar. The SDK resolves spritesheets automatically for FastPix streams using the URL pattern https://images.fastpix.com/{playbackId}/spritesheet.json.

Enable seek preview

Configure seek preview when building the player:

1val seekPreviewConfig = SeekPreviewConfig.Builder()
2 .setEnabled(true)
3 .setFallbackMode(PreviewFallbackMode.TIMESTAMP) // or NONE
4 .setEnablePreload(true)
5 .setPreloadRadius(1)
6 .setCacheEnabled(true)
7 .build()
8
9val player = FastPixPlayer.Builder(context)
10 .setSeekPreviewConfig(seekPreviewConfig)
11 .build()

Fallback modes

If the spritesheet doesn’t exist, or the media is not a FastPix stream, the SDK falls back:

  • TIMESTAMP: Shows a time label (for example, "02:30"). SpritesheetMetadata.bitmap may be null.
  • NONE: Shows nothing.

Listen for preview events

1player.setSeekPreviewListener(object : SeekPreviewListenerAdapter() {
2 override fun onSpritesheetInitialized() {
3 // Spritesheet metadata is available and preview can be used
4 }
5 override fun onSpritesheetFailed(error: Throwable) {
6 // Spritesheet unavailable; fallback may still work depending on config
7 }
8 override fun onPreviewShow() {
9 // Show your preview container
10 }
11 override fun onPreviewHide() {
12 // Hide your preview container
13 }
14 override fun onSpritesheetLoaded(metadata: SpritesheetMetadata) {
15 // metadata.bitmap: bitmap for current position (can be null in timestamp fallback)
16 // metadata.timestampMs: current seek timestamp (ms)
17 // Additional fields: rows, columns, frameWidth, frameHeight, frameCount,
18 // durationMs, intervalMs (distance between frames)
19 }
20})

Connect to a SeekBar

Wire the preview to your SeekBar’s touch events:

1seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
2 override fun onStartTrackingTouch(seekBar: SeekBar) {
3 player.showPreview()
4 }
5 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
6 if (fromUser) {
7 player.loadPreview(progress.toLong()) // progress in ms
8 }
9 }
10 override fun onStopTrackingTouch(seekBar: SeekBar) {
11 player.hidePreview()
12 player.seekTo(seekBar.progress.toLong())
13 }
14})

Fetch preview bitmaps directly

If you’re building a custom preview UI, you can request bitmaps directly from a coroutine:

1val bmp = player.getPreviewBitmap(timeMs = 30_000)
2val label = player.formatTimestamp(timeMs = 30_000)