- 前言
- 一、思路?
- 二、完整代码
前言
写一个可以随手指移动而移动的图片,用自定义view实现,重写onTouchEvent方法
一、思路?①:定义两个偏移量作为绘制图片时的起始位置
private var offsetX = 0f
private var offsetY = 0f
②:按下时记录手指的位置
声明
private var downX = 0f private var downY = 0f
记录
MotionEvent.ACTION_DOWN -> {
downX = event.x
downY = event.y
}
③:第二次移动时先移动到生成结束时的位置
声明
private var originOffsetX = 0f
private var originOffsetY = 0f
④:移动
MotionEvent.ACTION_MOVE -> {
offsetX = event.x - downX + originOffsetX
offsetY = event.y - downY + originOffsetY
invalidate()
}
用目前手指移动后的位置减去按下时手指的位置,在加上上次图片的位置
二、完整代码package com.lbj23.customview.customview
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.lbj23.customview.R
import com.lbj23.customview.dp
import com.lbj23.customview.getAvatar
class MovingImage(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
private val image = getAvatar(resources, R.drawable.bg6, 85.dp.toInt())
private var offsetX = 0f
private var offsetY = 0f
private var originOffsetX = 0f
private var originOffsetY = 0f
private var downX = 0f
private var downY = 0f
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawBitmap(image, offsetX, offsetY, paint)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
downX = event.x
downY = event.y
originOffsetX = offsetX
originOffsetY = offsetY
}
MotionEvent.ACTION_MOVE -> {
offsetX = event.x - downX + originOffsetX
offsetY = event.y - downY + originOffsetY
invalidate()
}
}
return true
}
}



