十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章给大家介绍怎么在Android中实现撤销反撤销功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
作为一家“创意+整合+营销”的成都网站建设机构,我们在业内良好的客户口碑。创新互联提供从前期的网站品牌分析策划、网站设计、网站制作、做网站、创意表现、网页制作、系统开发以及后续网站营销运营等一系列服务,帮助企业打造创新的互联网品牌经营模式与有效的网络营销方法,创造更大的价值。
首先,需要一个bean类存储每一笔的数据,这里定义一个PaintData,里面需要定义个draw方法,因为撤销的时候,需要重新绘制。
data class PaintData( var mPaint: Paint, //保存画笔 var mPath: Path //保存路径 ) { /** * 撤销和反撤销之后 重新绘制 * @param canvas 绘制的画布 */ fun draw(canvas: Canvas){ canvas.drawPath(mPath,mPaint) } }
2.2 修改清空画板方法
因为多了列表,所以清空画板的方法需要把列表也清除了
/** * 清空画布 * @param isClearList 时候清空数据列表 */ fun clear(isClearList:Boolean) { if(isClearList){ mRevokedList.clear() mPaintedList.clear() } mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() }
2.3 实现撤销方法
在view定义两个列表,一个是已经画的内容列表,一个是撤销内容的列表
//储存已经写的笔画 private var mPaintedList: MutableList= ArrayList () //已经撤销的列表 private var mRevokedList: MutableList = ArrayList ()
添加固话层canvas和bitmap,超出记录的画笔就写死在固化层了
//固化层,超出最大笔画就先绘制到这个层 private lateinit var mHoldBitmap: Bitmap private lateinit var mHoldCanvas: Canvas //最多记录20画笔迹 private val MAX_PAINT_RECORED = 20 //在测量的时候进行初始化: override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { if(mBufferCanvas == null){ mBufferBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) //canvas绘制的内容,将会在这个mBufferBitmap内 mBufferCanvas = Canvas(mBufferBitmap) } if(mHoldCanvas == null){ mHoldBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) mHoldCanvas = Canvas(mHoldBitmap) } }
然后定义撤回的方法
/** * 撤回一个笔迹 * @return 是否撤回成功 */ fun revoked(){ reDraw(mPaintedList) }
反撤销方法基本一致,只是改了个列表:
/** * 反撤回一个笔迹 */ fun unRevoked(){ reDraw(mRevokedList) }
然后重新绘制的方法为:
/** * 重新绘制 * @param paintList 需要操作的list */ private fun reDraw(paintList:MutableList){ if(paintList.size > 0){ val paint = paintList.removeAt(paintList.size-1) if(paintList === mPaintedList){ mRevokedList.add(paint) }else{ mPaintedList.add(paint) } //清空缓存画板 mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() } }
然后就是画笔的保存,在触摸按下的时候,进行画笔的保存
override fun onTouchEvent(event: MotionEvent): Boolean { when(event.action){ MotionEvent.ACTION_DOWN -> { //手指按下的时候 //将起始点移动到当前坐标 mPath.moveTo(event.x,event.y) //记录上次触摸的坐标,注意ACTION_DOWN方法只会执行一次 preX = event.x preY = event.y //保存画笔 mPaintedList.add(PaintData(Paint(mPaint),Path(mPath))) } MotionEvent.ACTION_MOVE -> { //手指移动的时候 //绘制圆滑曲线,即贝塞尔曲线,贝塞尔曲线这个知识自行了解 mPaintedList.get(mPaintedList.size-1).mPath.quadTo(preX,preY,event.x,event.y) //重新绘制,会调用onDraw方法 invalidate() preX = event.x preY = event.y } MotionEvent.ACTION_UP ->{ //清除路径的内容 mPath.reset() } } // true:告诉系统,这个触摸事件由我来处理 // false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点 return true }
最后绘制的时候:
override fun onDraw(canvas: Canvas) { super.onDraw(canvas) //超出缓存的就固化到缓存bitmap while(mPaintedList.size > MAX_PAINT_RECORED){ val paintData = mPaintedList.removeAt(0) paintData.draw(mHoldCanvas) } //绘制固化的内容到缓存Canvas mBufferCanvas.drawBitmap(mHoldBitmap,0f,0f,null) //绘制记录的画笔 for(paint in mPaintedList){ //重新绘制每个path paint.draw(mBufferCanvas) } //画出缓存bitmap的内容 canvas.drawBitmap(mBufferBitmap,0f,0f,null) }
最后清除画布的时候,需要把画笔列表也清除了:
/** * 清空画布 */ fun clear() { mRevokedList.clear() mPaintedList.clear() mHoldCanvas.drawColor(0, PorterDuff.Mode.CLEAR) mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() }
Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。
关于怎么在Android中实现撤销反撤销功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。