A lightweight and easy-to-use Android library for detecting device shake gestures using the accelerometer sensor.
- π― Simple Integration - Easy to set up with just a few lines of code
- βοΈ Configurable Sensitivity - Choose from preset sensitivity levels or create custom thresholds
- π Lifecycle Aware - Designed to work seamlessly with Android lifecycle
- π± Lightweight - Minimal footprint with no external dependencies
- π Well Documented - Comprehensive KDoc documentation included
Add the dependency to your app's build.gradle.kts file:
dependencies {
implementation("com.github.AnasEsh:shake_detector:<version>")
}Add JitPack to your project-level build.gradle.kts or settings.gradle.kts:
repositories {
maven { url = uri("https://jitpack.io") }
// ... other repositories
}Make sure you have mavenLocal() in your repositories if using a local build:
repositories {
mavenLocal()
// ... other repositories
}class MainActivity : AppCompatActivity() {
private lateinit var shakeDetector: ShakeDetector
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Initialize shake detector
shakeDetector = ShakeDetector(this, object : ShakeListener {
override fun onShaked() {
// Handle shake event
Toast.makeText(this@MainActivity, "Device shaken!", Toast.LENGTH_SHORT).show()
}
})
}
override fun onStart() {
super.onStart()
shakeDetector.start() // Start listening for shakes
}
override fun onStop() {
super.onStop()
shakeDetector.stop() // Stop listening to save battery
}
}// Using lambda for cleaner code
val shakeDetector = ShakeDetector(this) {
Log.d("Shake", "Device was shaken!")
// Handle shake event here
}// High sensitivity (less force needed)
val shakeDetector = ShakeDetector(
context = this,
shakeListener = /* ... handle shake */ ,
sensitivity = ShakeSensitivity.High
)
// Low sensitivity (more force needed)
val shakeDetector = ShakeDetector(
context = this,
shakeListener = /* ... handle shake */ ,
sensitivity = ShakeSensitivity.Low
)
// Custom threshold
val shakeDetector = ShakeDetector(
context = this,
shakeListener = /* ... handle shake */ ,
sensitivity = ShakeSensitivity.Custom(threshold = 800)
)
// Change sensitivity at runtime
shakeDetector.changeSensitivity(ShakeSensitivity.High)| Level | Description | Use Case |
|---|---|---|
High |
Very sensitive, triggers easily | Games, interactive apps |
Normal |
Balanced sensitivity (default) | General purpose apps |
Low |
Less sensitive, requires more force | Prevents accidental triggers |
Custom(threshold) |
User-defined threshold | Fine-tuned control |
class ShakeDetector(
context: Context,
shakeListener: ShakeListener,
sensitivity: ShakeSensitivity = ShakeSensitivity.Normal
)start()- Start listening for shake eventsstop()- Stop listening for shake eventschangeSensitivity(sensitivity: ShakeSensitivity)- Update sensitivity at runtime
UnsupportedOperationException- Thrown when accelerometer is not available
interface ShakeListener {
fun onShaked()
}sealed class ShakeSensitivity {
object High : ShakeSensitivity()
object Normal : ShakeSensitivity()
object Low : ShakeSensitivity()
data class Custom(val threshold: Int = 650) : ShakeSensitivity()
}- Android API Level: 24+ (Android 7.0)
- Permissions: None required
- Hardware: Device with accelerometer sensor
The library uses Android's SensorManager to monitor accelerometer data and applies a sophisticated algorithm to detect shake patterns:
- Data Collection: Monitors X, Y, Z acceleration values
- Pattern Recognition: Analyzes movement patterns over time
- Threshold Filtering: Applies configurable sensitivity thresholds
- Event Triggering: Requires multiple consecutive shakes within a time window
Recommended lifecycle integration:
class YourActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
shakeDetector.start() // Start when visible
}
override fun onStop() {
super.onStop()
shakeDetector.stop() // Stop to save battery
}
}- Always call
stop()in your activity'sonStop()oronPause()to prevent battery drain - The library automatically handles sensor availability checks
- Shake detection requires at least 3 consecutive shakes within 1 second
- Custom thresholds: lower values = higher sensitivity
Shake not detected:
- Ensure you called
start()method - Try increasing sensitivity with
ShakeSensitivity.High - Check if device has a working accelerometer
Too sensitive:
- Use
ShakeSensitivity.Lowor custom threshold - Increase the threshold value in
Custom(threshold)
Battery concerns:
- Always call
stop()when not needed - Consider using lifecycle-aware components
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For questions or support, please open an issue on GitHub.
Made with β€οΈ by AnasEsh