An Android accessibility service that converts tap gestures into scroll actions within selected apps.
- Tap-to-Scroll: Tap in designated screen zones to scroll up or down without swiping
- Customizable Zones: Choose from edge zones, side zones, or corner zones
- Smart Detection: Automatically avoids scrolling when tapping on interactive elements (links, buttons)
- Per-App Configuration: Enable tap-to-scroll only in apps you choose
- Adjustable Settings: Configure scroll distance, speed, and direction
- Tap the top 15% of the screen to scroll up
- Tap the bottom 15% of the screen to scroll down
- Tap the left 20% of the screen to scroll up
- Tap the right 20% of the screen to scroll down
- Tap top-left or top-right corners to scroll up
- Tap bottom-left or bottom-right corners to scroll down
- Android Studio Hedgehog (2023.1.1) or later
- JDK 17
- Android SDK 34
- Clone the repository
- Open in Android Studio
- Sync Gradle files
- Build the project:
./gradlew assembleDebug - Install on device:
./gradlew installDebug
cd TapToScroll
./gradlew assembleDebugThe APK will be at app/build/outputs/apk/debug/app-debug.apk
- Build and install the APK on your device
- Open the app and tap "Enable" on the service status banner
- In Android Accessibility Settings, find "Tap to Scroll" and enable it
- Return to the app and configure your preferred settings
- Add apps where you want tap-to-scroll enabled (Brave Browser is added by default)
- Choose your preferred zone layout
- Adjust scroll distance and speed to your liking
- Open one of your configured apps and tap in the scroll zones!
- Accessibility Service: Required to detect taps and inject scroll gestures
- Vibrate: For haptic feedback when scrolling
- Query All Packages: To show list of installed apps in the app selector
app/src/main/java/com/tapscroll/
├── MainActivity.kt # Main entry point
├── TapScrollApplication.kt # Application class
├── data/
│ ├── Models.kt # Data classes
│ └── PreferenceStore.kt # DataStore preferences
├── service/
│ ├── TapScrollService.kt # Accessibility service
│ └── GestureProcessor.kt # Tap processing logic
├── ui/
│ ├── SettingsScreen.kt # Main settings UI
│ ├── SettingsViewModel.kt # ViewModel
│ ├── components/ # Reusable UI components
│ └── theme/ # Material 3 theme
└── util/
├── ZoneCalculator.kt # Zone boundary calculations
└── NodeTreeHelper.kt # Accessibility node utilities
- The accessibility service creates a transparent overlay over the screen
- When a tap is detected, it checks if the tap location is in a scroll zone
- If in a zone, it queries the accessibility node tree to check for interactive elements
- If no interactive element is found, it injects a scroll gesture using
dispatchGesture() - If an interactive element is found, the tap passes through normally
The service checks for:
isClickable,isCheckable,isEditablepropertiesACTION_CLICKin the node's action list- Known interactive class names (Button, EditText, etc.)
- Web content role descriptions (link, button, etc.)
- Ensure the accessibility service is enabled in Android Settings
- Check that the target app is in your active apps list and enabled
- Try restarting the service by toggling it off and on
- Make sure you're tapping within the configured zones
- Check that the zone layout matches your expectations
- Try increasing the zone size in settings
- Ensure "Avoid interactive elements" is enabled
- Some web content may not properly expose accessibility info
MIT License - See LICENSE file for details
Contributions are welcome! Please feel free to submit issues and pull requests.