No description
  • Kotlin 96.4%
  • GLSL 2.9%
  • Shell 0.7%
Find a file
Ole-Morten Duesund 2736d42e74 Fix gesture tracking: 1:1 rotation and drag, better zone detection
Rotation:
- Use direct angle calculation between touch points (atan2)
- Track initial touch angle and effect angle separately
- Effect rotation now matches finger rotation exactly

Position drag:
- Remove all sensitivity dampening
- 1:1 mapping: finger moves 100px, effect center moves 100px

Gesture zones rebalanced:
- Rotation: only very center of focus zone (< 30% of focus height)
- Size adjustment: large area around effect (30% - 200%)
- Camera zoom: only far outside the effect (> 200%)

This prevents rotation from dominating size adjustments.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 16:02:43 +01:00
app Fix gesture tracking: 1:1 rotation and drag, better zone detection 2026-01-28 16:02:43 +01:00
gradle Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
.gitignore Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
build.gradle.kts Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
gradle.properties Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
gradlew Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
gradlew.bat Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
README.md Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00
settings.gradle.kts Initial implementation of Tilt-Shift Camera Android app 2026-01-28 15:26:41 +01:00

Tilt-Shift Camera

A dedicated Android camera app for tilt-shift photography with real-time preview, touch-based controls, and proper EXIF handling.

Features

  • Real-time tilt-shift effect preview - See the blur effect as you compose your shot
  • Touch-based controls:
    • Single finger drag to move the focus line position
    • Two-finger rotation to adjust blur angle
    • Pinch gesture to adjust blur zone size
    • Pinch in center to zoom camera
  • Zoom controls - Quick presets (0.5x, 1x, 2x, 5x) plus pinch-to-zoom
  • Auto picture orientation detection - Photos saved with correct EXIF orientation
  • GPS location tagging - Optional EXIF GPS data from device location
  • Haptic feedback - Tactile response for all interactions
  • Saves to gallery - Photos saved to Pictures/TiltShift/ folder

Requirements

  • Android 8.0 (API 26) or higher
  • Device with camera
  • OpenGL ES 2.0 support

Building

  1. Open the project in Android Studio
  2. Sync Gradle files
  3. Build and run on a physical device (camera preview won't work on emulator)

Or from command line:

./gradlew assembleDebug

Permissions

  • Camera (required) - For capturing photos
  • Location (optional) - For GPS tagging in EXIF data
  • Vibrate - For haptic feedback

Architecture

The app uses:

  • CameraX - Jetpack camera library for camera preview and capture
  • OpenGL ES 2.0 - Real-time shader-based blur effect
  • Jetpack Compose - Modern declarative UI
  • Kotlin Coroutines & Flow - Asynchronous operations and state management

Project Structure

app/src/main/java/no/naiv/tiltshift/
├── MainActivity.kt           # Entry point with permission handling
├── camera/
│   ├── CameraManager.kt      # CameraX setup and control
│   ├── LensController.kt     # Lens/zoom switching
│   └── ImageCaptureHandler.kt # Photo capture with effect
├── effect/
│   ├── TiltShiftRenderer.kt  # OpenGL renderer
│   ├── TiltShiftShader.kt    # GLSL shader management
│   └── BlurParameters.kt     # Effect state
├── ui/
│   ├── CameraScreen.kt       # Main Compose screen
│   ├── TiltShiftOverlay.kt   # Touch gesture handling & visualization
│   ├── ZoomControl.kt        # Zoom UI component
│   └── LensSwitcher.kt       # Lens selection UI
├── storage/
│   ├── PhotoSaver.kt         # MediaStore integration
│   └── ExifWriter.kt         # EXIF metadata handling
└── util/
    ├── OrientationDetector.kt
    ├── LocationProvider.kt
    └── HapticFeedback.kt

How the Tilt-Shift Effect Works

The tilt-shift effect simulates a selective focus lens that makes scenes appear miniature. The app achieves this through:

  1. Camera Preview → OpenGL SurfaceTexture
  2. Fragment Shader calculates distance from the focus line for each pixel
  3. Gradient blur is applied based on distance - center stays sharp, edges blur
  4. Two-pass Gaussian blur (optimized as separable passes) for quality and performance

License

MIT