Skip to content

UdaraWanasinghe/android-transform-layout

Repository files navigation

android-transform-layout

An Android layout that supports simultaneous handling of scaling, rotation, translation and fling gestures.

Preview

Using

  1. Import the library into your project.
dependencies {
    implementation "com.aureusapps.android:transform-layout:1.0.0"
}
  1. You can use the TransformLayout in your layout XML.
<com.aureusapps.android.transformlayout.TransformLayout
    android:id="@+id/transform_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:flingEnabled="true"
    app:rotateEnabled="true"
    app:scaleEnabled="true"
    app:transformEnabled="true"
    app:translateEnabled="true">

    <com.aureusapps.android.transformlayout.example.PainterLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.aureusapps.android.transformlayout.TransformLayout>
  1. You can use TransformGestureDetector in your custom view as follows.
class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : FrameLayout(context, attrs) {

    var isTransformEnabled = false
    val gestureDetector = TransformGestureDetector(context)

    private val gestureDetectorListener = object : TransformGestureDetectorListener {
        override fun onTransformStart(px: Float, py: Float, matrix: Matrix) {
        }

        override fun onTransformUpdate(px: Float, py: Float, oldMatrix: Matrix, newMatrix: Matrix) {
            invalidate()
        }

        override fun onTransformComplete(px: Float, py: Float, matrix: Matrix) {
        }

        override fun onSingleTap(px: Float, py: Float) {
        }
    }

    init {
        gestureDetector.setGestureDetectorListener(gestureDetectorListener)
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return isTransformEnabled
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        if (isTransformEnabled) {
            return gestureDetector.onTouchEvent(event)
        }
        return false
    }

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        if (!isTransformEnabled) {
            ev.transform(gestureDetector.inverseTransformMatrix)
        }
        return super.dispatchTouchEvent(ev)
    }

    override fun drawChild(canvas: Canvas, child: View, drawingTime: Long): Boolean {
        var result = false
        canvas.withMatrix(gestureDetector.transformMatrix) {
            result = super.drawChild(canvas, child, drawingTime)
        }
        return result
    }

}

Styling

<style name="TransformLayoutStyle">
    <item name="transformEnabled">true</item>
    <item name="scaleEnabled">true</item>
    <item name="rotateEnabled">true</item>
    <item name="translateEnabled">true</item>
    <item name="flingEnabled">true</item>
</style>

Appreciate my work!

If you find this library useful, please consider buying me a coffee.

Buy Me A Coffee

About

An Android layout that supports simultaneous handling of scaling, rotation, translation and fling gestures.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages