亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android畫板開發之撤銷反撤銷功能

2019-10-21 21:32:36
字體:
來源:轉載
供稿:網友

一、分析

這篇將會講解撤銷反撤銷功能的實現,先討論一下這個原理是怎么樣實現的。

每次撤回的內容,內容是怎么定義呢? 其實就是每一筆,每一筆作為撤回的內容,那每一筆怎么算呢,就是算手指從按下-移動-放開這一個過程就是一筆。

我們只需記錄這個過程為一筆,然后用一個已畫列表list列表來記錄這個過程的paint畫筆和路徑path。

撤銷的時候就把后面的一個數據移到另一個撤銷列表

反撤銷的時候,就把撤銷列表的最后面那條數據移動到已畫列表。

然后,還有一個重點,就是畫筆的保存數量,上面說記錄每一筆畫筆,這當然是有個限度,不可能畫了好幾百筆都記錄下來,這樣子內存消耗很大的,所以超出顯示畫筆數量的時候,我們就把以前的畫死在畫板上。

Android,畫板,撤銷,反撤銷

基本原理是這樣子的。接下來跟著我實現

二、實現

如何實現撤回功能

2.1 定義數據類

首先,需要一個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<PaintData> = ArrayList<PaintData>()//已經撤銷的列表private var mRevokedList: MutableList<PaintData> = ArrayList<PaintData>()

添加固話層canvas和bitmap,超出記錄的畫筆就寫死在固化層了

//固化層,超出最大筆畫就先繪制到這個層private lateinit var mHoldBitmap: Bitmapprivate 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<PaintData>){    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()  }

重點就是在于利用一個bean類來保存每筆的 畫筆和路徑,然后撤銷時候重新繪制。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久国产在线视频| 中文字幕精品一区久久久久| 成人免费视频xnxx.com| 欧美亚洲国产视频小说| 欧美在线视频观看免费网站| 亚洲男人天堂网| 91国内揄拍国内精品对白| 亚洲欧美国产精品va在线观看| 热久久美女精品天天吊色| 国产精品综合久久久| 国产高清视频一区三区| 91视频国产一区| 蜜臀久久99精品久久久无需会员| 欧美专区在线视频| 欧美高清理论片| 精品久久久在线观看| 国产精品视频一区国模私拍| 激情久久av一区av二区av三区| 国产精品久久久久久久电影| 成人网址在线观看| 精品国产欧美一区二区三区成人| 在线日韩第一页| www国产亚洲精品久久网站| 亚洲毛茸茸少妇高潮呻吟| 岛国视频午夜一区免费在线观看| 亚洲精品99久久久久中文字幕| 国产成人精品电影久久久| 91网在线免费观看| 久久精品视频一| 亚洲的天堂在线中文字幕| 欧美黑人国产人伦爽爽爽| 最近的2019中文字幕免费一页| 欧美香蕉大胸在线视频观看| 日韩视频中文字幕| 欧美日韩国产一中文字不卡| 国产美女被下药99| 国产精品偷伦免费视频观看的| 成人黄色在线观看| 国产成人avxxxxx在线看| 久久久久久一区二区三区| 国产大片精品免费永久看nba| 欧美超级免费视 在线| 成人国产精品一区| 成人观看高清在线观看免费| 国语自产精品视频在线看一大j8| 欧美精品性视频| 91精品久久久久久久久不口人| 中文字幕亚洲无线码在线一区| 亚洲天堂av网| 91爱爱小视频k| 日韩精品在线观看一区| 91久久在线视频| 国产精品视频永久免费播放| 国产精品日韩欧美综合| 中文字幕日韩高清| 欧美激情一区二区久久久| 91在线免费网站| 日韩在线观看视频免费| 亚洲欧美综合图区| 欧美日韩亚洲一区二区| 久久久久久国产免费| 亚洲福利视频网站| 国产精品xxx视频| 国产精品高精视频免费| 中文字幕av一区二区三区谷原希美| 亚洲成人精品视频在线观看| 久久久中精品2020中文| 国产日本欧美一区二区三区| 精品国产一区二区在线| 亚洲电影天堂av| 亚洲一区二区中文| 国产精品视频精品视频| 国产精品久久不能| 91国产高清在线| 欧美国产日本高清在线| 亚洲成人网在线| 国产精品久久久久久久久久新婚| 色婷婷亚洲mv天堂mv在影片| 国产精品美女主播在线观看纯欲| 国产精品视频地址| 日韩av观看网址| 久久久精品一区二区| 3344国产精品免费看| 日韩免费在线看| 久久久久99精品久久久久| 国产精品三级网站| 中文字幕亚洲一区| 日韩电影在线观看中文字幕| 青草青草久热精品视频在线观看| 午夜精品久久久久久99热软件| 亚洲美女又黄又爽在线观看| 亚洲片国产一区一级在线观看| 久久国内精品一国内精品| 亚洲国产日韩欧美在线动漫| 精品日韩美女的视频高清| 国产成人91久久精品| 亚洲色图第一页| 亚洲精品aⅴ中文字幕乱码| 欧美日韩在线视频一区二区| 欧美xxxx综合视频| 成人综合国产精品| 国产在线观看91精品一区| 成人激情在线播放| 久久精品国产亚洲精品2020| 午夜精品一区二区三区在线播放| 色先锋久久影院av| 久久人人爽人人爽人人片亚洲| 国产亚洲人成a一在线v站| 国产精品白丝jk喷水视频一区| 清纯唯美亚洲激情| 国产精品久久久久77777| 成人乱色短篇合集| 中文字幕亚洲欧美日韩在线不卡| 97视频在线观看视频免费视频| 91chinesevideo永久地址| 欧美大片在线影院| 日韩在线免费av| 国产欧美韩国高清| 国产精品女视频| 亚洲成人精品久久久| 亚洲高清一区二| 国产精品吹潮在线观看| 中文字幕亚洲第一| 91国产一区在线| 欧美裸体男粗大视频在线观看| 91色视频在线观看| 国产一区二区三区在线观看网站| 欧美美女15p| 欧美激情第6页| 日韩最新中文字幕电影免费看| 国产视频在线一区二区| 精品国内亚洲在观看18黄| 亚洲久久久久久久久久久| 欧美电影在线观看高清| 欧美最近摘花xxxx摘花| 国产suv精品一区二区三区88区| 91chinesevideo永久地址| 日韩欧美精品在线观看| 国产精品视频最多的网站| 91av视频在线免费观看| 国产成人亚洲综合91精品| 亚洲自拍偷拍第一页| 国产一区二区三区高清在线观看| 亚洲性视频网站| 欧美色videos| 欧美精品成人在线| 91精品国产91久久| 欧美激情小视频| 久久久噜久噜久久综合| 亚洲综合中文字幕在线| 国产精品一区二区三区免费视频| 一区二区三区亚洲| 黑人狂躁日本妞一区二区三区| 久久综合久久88| 亚洲最大成人免费视频| 久久久久久噜噜噜久久久精品| 欧美日韩ab片| 国产精品久久久久aaaa九色| 亚洲欧美国产精品va在线观看| 久久免费高清视频| 久久久久这里只有精品| 在线观看欧美www| 992tv成人免费影院| 久久精品国产亚洲7777|