KOTLIN代碼 安卓用onLayout實現自定VIEW的放大和縮小,並保存大小,用LAMBDA交給另一個VIEW
时间: 2023-06-23 07:09:31 浏览: 164
Android 使用Kotlin来实现自定义View之雷达图
以下是一个使用 Kotlin 在 Android 中实现自定义 View 放大和缩小的示例代码:
```
class CustomView(context: Context, attrs: AttributeSet?) : View(context, attrs) {
private var scaleFactor = 1f
private var lastScaleFactor = 1f
init {
// 在这里可以设置其他属性
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
// 如果 view 大小有改变
if (changed) {
// 计算缩放比例
scaleFactor = min((width / 2f) / (measuredWidth / 2f), (height / 2f) / (measuredHeight / 2f))
lastScaleFactor = scaleFactor
// 调整 view 大小
val newWidth = (measuredWidth * scaleFactor).toInt()
val newHeight = (measuredHeight * scaleFactor).toInt()
setMeasuredDimension(newWidth, newHeight)
// 将大小传递给其他 view
onSizeChanged?.invoke(newWidth, newHeight)
}
}
// 保存大小的 Lambda
var onSizeChanged: ((width: Int, height: Int) -> Unit)? = null
// 处理缩放手势
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_MOVE -> {
// 计算缩放比例
scaleFactor *= event.scale
scaleFactor = max(0.1f, min(scaleFactor, 10f))
// 调整 view 大小
val newWidth = (measuredWidth * scaleFactor).toInt()
val newHeight = (measuredHeight * scaleFactor).toInt()
setMeasuredDimension(newWidth, newHeight)
// 如果缩放比例有改变,将大小传递给其他 view
if (scaleFactor != lastScaleFactor) {
onSizeChanged?.invoke(newWidth, newHeight)
lastScaleFactor = scaleFactor
}
return true
}
MotionEvent.ACTION_UP -> {
return true
}
else -> {
return super.onTouchEvent(event)
}
}
}
}
```
这个自定义 View 在 `onLayout` 方法中计算缩放比例,然后调整自己的大小,并将新的大小传递给其他 view。在处理缩放手势时,它会更新缩放比例,并根据新的比例调整自己的大小,然后将新的大小传递给其他 view。可以通过设置 `onSizeChanged` 属性来传递大小。
阅读全文