안 드 로 이 드 화판 개발 의 취소 기능

분석
이 편 은 반 철회 기능 의 실현 을 설명 할 것 이 며,먼저 이 원리 가 어떻게 실현 되 었 는 지 토론 할 것 이다.
매번 철회 하 는 내용 을 내용 은 어떻게 정의 합 니까?사실은 매 획,매 획 을 철회 하 는 내용 으로 한 획 한 획 을 어떻게 계산 합 니까?손가락 으로 누 르 고-이동-놓 는 과정 이 한 획 입 니 다.
우 리 는 이 과정 을 한 획 으로 기록 한 다음,그 려 진 목록 list 목록 으로 이 과정 을 기록 한 paint 붓 과 경로 path 를 사용 합 니 다.
취소 할 때 뒤의 데 이 터 를 다른 취소 목록 으로 옮 깁 니 다.
취소 할 때 취소 목록 의 맨 뒤에 있 는 데 이 터 를 그림 목록 으로 이동 합 니 다.
그 다음 에 또 하나의 중점 은 바로 붓 의 보존 수량 이다.위 에서 말 한 모든 붓 을 기록 하 는 것 이다.이것 은 당연히 한계 가 있다.수백 획 을 그 려 서 기록 할 수 없다.이런 메모리 소모 가 매우 크기 때문에 붓 의 수량 을 초과 할 때 우 리 는 앞의 그림 을 화판 에 죽 였 다.

기본 원 리 는 이렇다.이제 저 를 따라 이 루어 주세요.
실현
어떻게 철회 기능 을 실현 합 니까?
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: 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<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 류 를 이용 하여 모든 붓 과 경 로 를 저장 한 다음 취소 할 때 다시 그 리 는 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기