在绘图应用中,当用户想撤销一个刚刚绘制的形状时,会出现一个常见的问题:如何删除上一个形状并在画布上呈现一个新的版本,而不是抹去整个画布并从头开始再次重绘。
以下是一个简单的解决方案:
data class CanvasHistory(
val bitmap: Bitmap,
val paths: MutableList
class MainActivity : AppCompatActivity() {
private val canvasHistory = mutableListOf()
private lateinit var canvas: Canvas
private lateinit var bitmap: Bitmap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 创建画布和位图
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
canvas = Canvas(bitmap)
setContentView(R.layout.activity_main)
}
// 用于绘制形状的函数
fun drawShape(shape: Shape) {
shape.draw(canvas) // 在画布上绘制形状
// 将更改保存到history
canvasHistory.add(
CanvasHistory(
bitmap.copy(bitmap.config, true), // 创建新位图副本
mutableListOf(), // 由于路径和形状是重新绘制的,所以将列表清空
mutableListOf()
)
)
}
// 用于撤销最后一个绘制操作的函数
fun undo() {
if (canvasHistory.size > 1) {
// 删除最后一个history
canvasHistory.removeAt(canvasHistory.lastIndex)
// 用剩余的历史记录重新绘制
val lastHistory = canvasHistory.last()
canvas.drawBitmap(lastHistory.bitmap, 0f, 0f, null)
lastHistory.paths.forEach { path ->
canvas.drawPath(path, paint)
}
lastHistory.shapes.forEach { shape ->
shape.draw(canvas)
}
}
}
}