FrameBar
A flexible and customizable Compose Multiplatform seekbar for frame-based timelines
A customizable Kotlin Multiplatform seekbar component for Compose Multiplatform applications. Perfect for media players, video editing tools, or any scenario requiring precise position control within a frame-based timeline.
Key Features
- Precise Control: Support for both continuous (
Float) and discrete () navigation.
Setup
Add FrameBar to your commonMain dependencies:
kotlin {
sourceSets {
commonMain.dependencies {
implementation("com.rafambn:FrameBar:1.0.0")
}
}
}
Usage
Basic Usage
Discrete Index-Based Navigation
val currentFrame = remember { mutableStateOf(0) }
FrameBar(
pointer = pointer,
markers = frameMarkers,
index = currentFrame.value,
onIndexChange = { newFrame ->
currentFrame.value = newFrame
}
)
Custom Value Range
FrameBar(
value = currentPosition.value,
valueRange = 0f..100f,
onValueChange = { normalizedValue ->
val actualPosition = normalizedValue * totalDurationMs
seekTo(actualPosition)
}
)
Event Handling
FrameBar(
pointer = pointer,
markers = markers,
value = currentPosition.value,
onValueChange = { position ->
updatePosition(position)
},
onDragStarted = {
showPreview()
},
onDragStopped = {
hidePreview()
commitPosition()
}
)
Customization
Marker Configuration
val coloredMarker = Marker(
size = DpSize(15.dp, 20.dp),
topOffset = 10.dp,
color = Color.Blue
)
val imageMarker = Marker(
size = DpSize(20.dp, 30.dp),
topOffset = 5.dp,
bitmap = myImageBitmap
)
Pointer selection modes:
import com.rafambn.framebar.enums.PointerSelection
FrameBar(
pointerSelection = PointerSelection.LEFT,
pointerSelection = PointerSelection.CENTER,
pointerSelection = PointerSelection.RIGHT,
)
Pointer coercion mode:
import com.rafambn.framebar.enums.CoercePointer
FrameBar(
coercedPointer = CoercePointer.COERCED,
coercedPointer = CoercePointer.NOT_COERCED,
)