這篇文章給大家介紹怎么在Android中實(shí)現(xiàn)撤銷反撤銷功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
作為一家“創(chuàng)意+整合+營(yíng)銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷方法,創(chuàng)造更大的價(jià)值。
首先,需要一個(gè)bean類存儲(chǔ)每一筆的數(shù)據(jù),這里定義一個(gè)PaintData,里面需要定義個(gè)draw方法,因?yàn)槌蜂N的時(shí)候,需要重新繪制。
data class PaintData( var mPaint: Paint, //保存畫(huà)筆 var mPath: Path //保存路徑 ) { /** * 撤銷和反撤銷之后 重新繪制 * @param canvas 繪制的畫(huà)布 */ fun draw(canvas: Canvas){ canvas.drawPath(mPath,mPaint) } }
2.2 修改清空畫(huà)板方法
因?yàn)槎嗔肆斜?,所以清空?huà)板的方法需要把列表也清除了
/** * 清空畫(huà)布 * @param isClearList 時(shí)候清空數(shù)據(jù)列表 */ fun clear(isClearList:Boolean) { if(isClearList){ mRevokedList.clear() mPaintedList.clear() } mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() }
2.3 實(shí)現(xiàn)撤銷方法
在view定義兩個(gè)列表,一個(gè)是已經(jīng)畫(huà)的內(nèi)容列表,一個(gè)是撤銷內(nèi)容的列表
//儲(chǔ)存已經(jīng)寫(xiě)的筆畫(huà) private var mPaintedList: MutableList= ArrayList () //已經(jīng)撤銷的列表 private var mRevokedList: MutableList = ArrayList ()
添加固話層canvas和bitmap,超出記錄的畫(huà)筆就寫(xiě)死在固化層了
//固化層,超出最大筆畫(huà)就先繪制到這個(gè)層 private lateinit var mHoldBitmap: Bitmap private lateinit var mHoldCanvas: Canvas //最多記錄20畫(huà)筆跡 private val MAX_PAINT_RECORED = 20 //在測(cè)量的時(shí)候進(jìn)行初始化: override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { if(mBufferCanvas == null){ mBufferBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) //canvas繪制的內(nèi)容,將會(huì)在這個(gè)mBufferBitmap內(nèi) mBufferCanvas = Canvas(mBufferBitmap) } if(mHoldCanvas == null){ mHoldBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) mHoldCanvas = Canvas(mHoldBitmap) } }
然后定義撤回的方法
/** * 撤回一個(gè)筆跡 * @return 是否撤回成功 */ fun revoked(){ reDraw(mPaintedList) }
反撤銷方法基本一致,只是改了個(gè)列表:
/** * 反撤回一個(gè)筆跡 */ 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) } //清空緩存畫(huà)板 mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() } }
然后就是畫(huà)筆的保存,在觸摸按下的時(shí)候,進(jìn)行畫(huà)筆的保存
override fun onTouchEvent(event: MotionEvent): Boolean { when(event.action){ MotionEvent.ACTION_DOWN -> { //手指按下的時(shí)候 //將起始點(diǎn)移動(dòng)到當(dāng)前坐標(biāo) mPath.moveTo(event.x,event.y) //記錄上次觸摸的坐標(biāo),注意ACTION_DOWN方法只會(huì)執(zhí)行一次 preX = event.x preY = event.y //保存畫(huà)筆 mPaintedList.add(PaintData(Paint(mPaint),Path(mPath))) } MotionEvent.ACTION_MOVE -> { //手指移動(dòng)的時(shí)候 //繪制圓滑曲線,即貝塞爾曲線,貝塞爾曲線這個(gè)知識(shí)自行了解 mPaintedList.get(mPaintedList.size-1).mPath.quadTo(preX,preY,event.x,event.y) //重新繪制,會(huì)調(diào)用onDraw方法 invalidate() preX = event.x preY = event.y } MotionEvent.ACTION_UP ->{ //清除路徑的內(nèi)容 mPath.reset() } } // true:告訴系統(tǒng),這個(gè)觸摸事件由我來(lái)處理 // false:告訴系統(tǒng),這個(gè)觸摸事件我不處理,這時(shí)系統(tǒng)會(huì)把觸摸事件傳遞給imageview的父節(jié)點(diǎn) return true }
最后繪制的時(shí)候:
override fun onDraw(canvas: Canvas) { super.onDraw(canvas) //超出緩存的就固化到緩存bitmap while(mPaintedList.size > MAX_PAINT_RECORED){ val paintData = mPaintedList.removeAt(0) paintData.draw(mHoldCanvas) } //繪制固化的內(nèi)容到緩存Canvas mBufferCanvas.drawBitmap(mHoldBitmap,0f,0f,null) //繪制記錄的畫(huà)筆 for(paint in mPaintedList){ //重新繪制每個(gè)path paint.draw(mBufferCanvas) } //畫(huà)出緩存bitmap的內(nèi)容 canvas.drawBitmap(mBufferBitmap,0f,0f,null) }
最后清除畫(huà)布的時(shí)候,需要把畫(huà)筆列表也清除了:
/** * 清空畫(huà)布 */ fun clear() { mRevokedList.clear() mPaintedList.clear() mHoldCanvas.drawColor(0, PorterDuff.Mode.CLEAR) mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR) invalidate() }
Android是一種基于Linux內(nèi)核的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。
關(guān)于怎么在Android中實(shí)現(xiàn)撤銷反撤銷功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。