记录自定义view实现滑动和缩放

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
        }

    }
}

猜你喜欢

转载自blog.csdn.net/genmenu/article/details/98640255