package com.plugin.ggg.motionlayoutdemo
import android.content.Context
import android.util.AttributeSet
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.ScaleGestureDetector
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
/**
* @author ggg
* @date 2019/8/6-9:15
*/
class CustomView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
AppCompatImageView(context, attrs, defStyleAttr) {
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context) : this(context, null)
fun setListener(parent: ViewGroup) {
parent.setOnTouchListener { _, event ->
gestureDetector.onTouchEvent(event) and scaleGestureDetector.onTouchEvent(
event
)
}
}
companion object {
var isScale = false
}
private val gestureDetector: GestureDetector by lazy {
GestureDetector(context, listener)
}
private val listener: CustomGestureListener by lazy {
CustomGestureListener(this)
}
private val scaleGestureDetector: ScaleGestureDetector by lazy {
ScaleGestureDetector(context, listener)
}
class CustomGestureListener(private val view: CustomView) :
GestureDetector.SimpleOnGestureListener(), ScaleGestureDetector.OnScaleGestureListener {
private var lastX: Float = 0f
private var lastY: Float = 0f
private var preWidth = 0
private var preHeight = 0
private var scale = 1.0f
private var preScale = 1.0f
override fun onScaleBegin(detector: ScaleGestureDetector?): Boolean {
isScale = true
preWidth = view.width
preHeight = view.height
return true
}
override fun onScaleEnd(detector: ScaleGestureDetector?) {
preScale = scale
isScale = false
}
override fun onScale(detector: ScaleGestureDetector?): Boolean {
scale = preScale * (detector?.scaleFactor ?: 1.0f)
view.scaleX = scale
view.scaleY = scale
return false
}
override fun onDown(e: MotionEvent?): Boolean {
lastX = e?.rawX ?: 0f
lastY = e?.rawY ?: 0f
return true
}
override fun onDoubleTap(e: MotionEvent?): Boolean {
isScale = true
return true
}
override fun onScroll(
e1: MotionEvent?,
e2: MotionEvent?,
distanceX: Float,
distanceY: Float
): Boolean {
if (isScale) {
return true
}
val dx = (e2?.rawX ?: 0f) - lastX
val dy = (e2?.rawY ?: 0f) - lastY
view.layout(
(view.left + dx).toInt(),
(view.top + dy).toInt(),
(view.right + dx).toInt(),
(view.bottom + dy).toInt()
)
lastX = e2?.rawX ?: 0f
lastY = e2?.rawY ?: 0f
return false
}
}
}
记录自定义view实现滑动和缩放
最新推荐文章于 2021-12-23 16:00:33 发布