Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用画布位图绘制撤消/重做(KOTLIN)_Android_Kotlin_Canvas_Paint_Undo Redo - Fatal编程技术网

Android 使用画布位图绘制撤消/重做(KOTLIN)

Android 使用画布位图绘制撤消/重做(KOTLIN),android,kotlin,canvas,paint,undo-redo,Android,Kotlin,Canvas,Paint,Undo Redo,因此,我试图撤销/重做操作,关于这个问题有一些关于stackoverflow的答案,但它们中的任何一个都无助于解决我的问题。所以我有了画布实现的自定义视图,其中我有一个数组来存储我的绘图路径,但任何时候我开始在其中存储什么都不做。任何建议或链接都将不胜感激 我的自定义视图类: private const val STROKE_WIDTH=12f 类CanvasCustomView@JvmOverloads构造函数(上下文:context,attrs:AttributeSet?=null,defs

因此,我试图撤销/重做操作,关于这个问题有一些关于stackoverflow的答案,但它们中的任何一个都无助于解决我的问题。所以我有了画布实现的自定义视图,其中我有一个数组来存储我的绘图路径,但任何时候我开始在其中存储什么都不做。任何建议或链接都将不胜感激

我的自定义视图类:

private const val STROKE_WIDTH=12f
类CanvasCustomView@JvmOverloads构造函数(上下文:context,attrs:AttributeSet?=null,defstylettr:Int=0):视图(context,attrs,defstylettr){
私有变量路径=路径()
private val path=ArrayList()
private val undonePaths=ArrayList()
私有lateinit var extraCanvas:Canvas
私有lateinit变量extraBitmap:位图
私有变量motionTouchEventX=0f
私有变量motionTouchEventY=0f
专用var currentX=0f
专用var电流Y=0f
private val touchTolerance=ViewConfiguration.get(context).scaledTouchSlop
私人娱乐touchStart(){
path.reset()
path.moveTo(motionTouchEventX、motionTouchEventY)
currentX=motionTouchEventX
currentY=motionTouchEventY
}
私人娱乐活动{
val距离X=abs(motionTouchEventX-currentX)
val distanceY=abs(motionTouchEventY-currentY)
如果(距离X>=touchTolerance | |距离>=touchTolerance){
path.quadTo(
currentX,
目前,,
(motionTouchEventX+currentX)/2,
(motionTouchEventY+currentY)/2)
currentX=motionTouchEventX
currentY=motionTouchEventY
外部画布绘制路径(路径,绘制)
}
使无效
}
私人趣味润色(){
path.reset()
}
绘画乐趣{
//我想在这里做点什么
}
趣味画画{
extraCanvas.drawColor(0,PorterDuff.Mode.CLEAR)
path.reset()
使无效
}
private val backgroundColor=ResourcesCompat.getColor(resources,R.color.colorBackground,null)
private val drawColor=ResourcesCompat.getColor(resources,R.color.colorPaint,null)
private val paint=paint()。应用{
颜色=绘图颜色
Isatarias=真
isDither=true
style=Paint.style.STROKE
strokeJoin=Paint.Join.ROUND
strokeCap=油漆、盖、圆形
冲程宽度=冲程宽度
}
覆盖大小更改(宽度:Int,高度:Int,旧宽度:Int,旧高度:Int){
super.onSizeChanged(宽度、高度、旧宽度、旧高度)
如果(::extraBitmap.isInitialized)extraBitmap.recycle()
extraBitmap=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888)
extraCanvas=画布(extraBitmap)
extraCanvas.drawColor(背景色)
}
覆盖onDraw(画布:画布?){
super.onDraw(画布)
canvas?.drawBitmap(外部位图,0f,0f,null)
}
重写事件(事件:MotionEvent?):布尔值{
如果(事件==null)
返回错误
motionTouchEventX=event.x
motionTouchEventY=event.y
何时(事件、动作){
MotionEvent.ACTION\u DOWN->touchStart()
MotionEvent.ACTION\u MOVE->touchMove()
MotionEvent.ACTION\u UP->touchUp()
}
返回真值
}
}

所以我决定不使用位图,以防需要存储路径集合,而且它非常昂贵。因此,我的解决方案具有撤销/重做和重置功能

导入android.content.Context
导入android.graphics*
导入android.util.AttributeSet
导入android.util.Log
导入android.view.MotionEvent
导入android.view.view
导入android.view.ViewConfiguration
导入androidx.core.content.res.ResourcesCompat
导入kotlin.math.abs
类CanvasCustomView@JvmOverloads构造函数(上下文:context,attrs:AttributeSet?=null,defstylettr:Int=0):视图(context,attrs,defstylettr){
伴星{
私有常量值笔划宽度=12f
}
私有变量路径=路径()
private val path=ArrayList()
private val undonePaths=ArrayList()
私有val外部画布:画布?=null
私有变量motionTouchEventX=0f
私有变量motionTouchEventY=0f
专用var currentX=0f
专用var电流Y=0f
private val touchTolerance=ViewConfiguration.get(context).scaledTouchSlop
private val paint=paint()。应用{
color=ResourcesCompat.getColor(resources,R.color.colorBlack,null)
Isatarias=真
isDither=true
style=Paint.style.STROKE
strokeJoin=Paint.Join.ROUND
strokeCap=油漆、盖、圆形
冲程宽度=冲程宽度
}
绘画乐趣{
path.reset()//避免从path()保存重做
路径。清除()
使无效
}
绘画乐趣{
如果(路径大小>0){
UndonePath.add(path.removeAt(path.size-1))
使无效
}否则{
Log.d(“撤销错误”,“撤销操作出错”)
}
}
绘画乐趣{
如果(撤消路径大小>0){
paths.add(undonePaths.removeAt(undonePaths.size-1))
使无效
}否则{
Log.d(“重做错误”,“重做操作出错”)
}
}
覆盖onDraw(画布:画布?){
super.onDraw(画布)
用于(路径中的路径){
画布?.drawPath(路径,绘制)
}
画布?.drawPath(路径,绘制)
}
重写事件(事件:MotionEvent?):布尔值{
如果(事件==null)
返回错误
motionTouchEventX=event.x
motionTouchEventY=event.y
何时(事件、动作){
MotionEvent.ACTION\u向下->{
撤销债务
path.reset()