Android(Kotlin)画布撤销操作问题
创始人
2024-10-13 07:31:06
0

在绘图应用中,当用户想撤销一个刚刚绘制的形状时,会出现一个常见的问题:如何删除上一个形状并在画布上呈现一个新的版本,而不是抹去整个画布并从头开始再次重绘。

以下是一个简单的解决方案:

  1. 创建一个名为CanvasHistory的数据类,保存前一次绘制的所有笔画、路径和形状。这样,我们就可以通过遍历历史记录来一步步地撤销所有先前的绘制。

data class CanvasHistory( val bitmap: Bitmap, val paths: MutableList, val shapes: MutableList )

  1. 在绘制应用程序的主框架中创建一个CanvasHistory列表,用于跟踪所有的绘制历史。

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)
        }
    }
}

}

  1. 在撤销操作中,我们从canvasHistory列表中删除最后一个记录。然后,我们

相关内容

热门资讯

透视诀窍!aapoker脚本,... 透视诀窍!aapoker脚本,AApoker发牌其实是有教程,三分钟教程(有挂方法)1、aapoke...
透视窍要!wepoker软件安... 透视窍要!wepoker软件安装包,HHpoker正品竟然存在有教程,第十分钟教程(有挂教程)1、进...
透视步骤!德州透视hhpoke... 透视步骤!德州透视hhpoker,HHpoker脚本竟然真的是有开挂,第九分钟教程(新版有挂)1、德...
透视教程书!wpk系统是否存在... 透视教程书!wpk系统是否存在作必弊行为,WPK私人局一贯是有工具,9分钟教程(真的有挂)1、首先打...
透视项目!hhpoker有没有... 透视项目!hhpoker有没有作必弊辅助,HHpoker脚本挂真是是有神器,第四分钟教程(有挂技巧)...
透视经验!wepoker私人局... 透视经验!wepoker私人局俱乐部,WePoKer脚本总是是真的有安装,第十分钟教程(有挂秘诀)进...
透视方式!wepoker免费透... 透视方式!wepoker免费透视,WePoKer助手真是存在有开挂,第9分钟教程(有挂规律)1、下载...
透视要领!德普之星辅助器app... 透视要领!德普之星辅助器app,德普之星免费一直是有安装,第八分钟教程(有挂方法)1、德普之星辅助器...
透视窍门!hhpoker辅助软... 透视窍门!hhpoker辅助软件,HHpoker有透视都是有开挂,4分钟教程(有挂教学)1、hhpo...
透视机巧!pokemomo辅助... 透视机巧!pokemomo辅助工具,WePoKer轻量版确实存在有下载,第七分钟教程(有挂神器)一、...