An Android layout that supports simultaneous handling of scaling, rotation, translation and fling gestures.
- Import the library into your project.
dependencies {
implementation "com.aureusapps.android:transform-layout:1.0.0"
}
- 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>
- 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
}
}
<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>
If you find this library useful, please consider buying me a coffee.