练习-实现抢夺的多点触控的view


自定义view

package com.wuhongru.workman.myView

import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import com.wuhongru.workman.R
import com.wuhongru.workman.dp
import com.wuhongru.workman.getReplacement

class TouchView2(context: Context, attrs: AttributeSet) : View(context, attrs) {
    private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val mBitmap = getReplacement(resources,300.dp.toInt(), R.drawable.ic_toma)
    private var originalOffsetX = 0f
    private var originalOffsetY = 0f
    private var mTrackingPointerId = 0
    private var offsetX = 0f
    private var offsetY = 0f
    private var downX = 0f
    private var downY = 0f

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawBitmap(mBitmap,offsetX,offsetY,mPaint)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when(event.actionMasked){
            MotionEvent.ACTION_DOWN->{
                mTrackingPointerId = event.getPointerId(0)
                downX = event.x
                downY = event.y
            }
            MotionEvent.ACTION_POINTER_DOWN->{
                val actionIndex = event.actionIndex
                mTrackingPointerId = event.getPointerId(actionIndex)
                downX = event.getX(actionIndex)
                downY = event.getY(actionIndex)
                originalOffsetX = offsetX
                originalOffsetY = offsetY
            }
            MotionEvent.ACTION_POINTER_UP->{
                val actionIndex = event.actionIndex
                val pointerId = event.getPointerId(actionIndex)
                if (pointerId == mTrackingPointerId){
                    val newIndex = if (actionIndex == event.pointerCount-1) {
                        event.pointerCount - 2
                    }else{
                        event.pointerCount - 1
                    }
                    mTrackingPointerId = event.getPointerId(newIndex)
                    downX = event.getX(newIndex)
                    downY = event.getY(newIndex)
                    originalOffsetX = offsetX
                    originalOffsetY = offsetY
                }
            }
            MotionEvent.ACTION_MOVE->{
                val index = event.findPointerIndex(mTrackingPointerId)
                offsetX = event.getX(index) - downX + originalOffsetX
                offsetY = event.getY(index) - downY + originalOffsetY
                invalidate()
            }
        }
        return true
    }
}

文章作者: Lao Wu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lao Wu !
评论
  目录