2014-06-06 1 views
0

나는 pdf 파일이 있고 나는 우스운 canvas.And에 경로를 당기고있다. 나는 pdf 페이지를 스크롤 할 때 이전 캔버스를 보여 주려고한다. 나는 pdf 페이지 번호와 경로를 저장하고있다.android에서 페이지를 스크롤 할 때 이전 경로를 캔버스에 표시하는 방법은 무엇입니까?

내 코드 :

이 onTouch입니다 : ACTION_DOWN에 내가 경로에 대한 새로운 생성자를 생성하고이 새로운 경로를 부르고 모든이거든요 나는 잘 작동하는이 경로를 제거 된 path.If에 이전 경로와 최우선을 제거했다 . 배열 목록에 savingCanvas를 들어

switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 

     signaturePaint = new Paint(Paint.DITHER_FLAG); 
     signaturePaint.setAntiAlias(true); 
     signaturePaint.setDither(true); 
     signaturePaint.setColor(0xff0000cc); 
     signaturePaint.setStyle(Paint.Style.STROKE); 
     signaturePaint.setStrokeJoin(Paint.Join.ROUND); 
     signaturePaint.setStrokeCap(Paint.Cap.ROUND); 
     signaturePaint.setStrokeWidth(1); 

      **signaturePath = new Path();// When calling this my problem occure** 

     if (Constants.draw) { 

      Point p = getPagePositionOnScreen(currentPage); 

      int currentPageWidth = getCurrentPageWidth(currentPage); 
      int currentPageHeight = (int) getCurrentPageHeight(currentPage); 
      if (currentPageWidth < x || currentPageHeight < y) { 

      } else { 
       if (Constants.isSignatureSelected) 
        signaturePath.moveTo(x, y); 
       // pdfcanvas.moveTo(x, y); 
      } 
      firstX = x; 
      firstY = y; 
     } 
     break; 
    case MotionEvent.ACTION_MOVE: 
     if (Constants.draw) { 

      mPageNumber.add(currentPage); 
      // int[][] currentPagesSize = pagesProvider.getPageSizes(); 
      float pageMarginX = getCurrentMarginX(); 
      float pageMarginy = getCurrentMarginY(); 
      // int pageWidth = currentPagesSize[0][0]; 
      // int pageHeight = currentPagesSize[0][1]; 
      int currentPageWidth = getCurrentPageWidth(currentPage); 
      int currentPageHeight = (int) getCurrentPageHeight(currentPage); 
      if (currentPageWidth < x || currentPageHeight < y) { 

      } else { 
       resetDirtyRect(x, y); 
       int historySize = event.getHistorySize(); 
       for (int i = 0; i < historySize; i++) { 
        float historicalX = event.getHistoricalX(i); 
        float historicalY = event.getHistoricalY(i); 
        expandDirtyRect(historicalX, historicalY); 
        if (Constants.isSignatureSelected) 
         signaturePath.lineTo(historicalX, historicalY); 
       } 

      } 
     } 


     break; 
    case MotionEvent.ACTION_UP: 
     if (Constants.draw) { 


      firstX = x; 
      firstY = y; 
      if (Constants.isSignatureSelected) 
       saveCanvas(); 
     } 
     break; 
    } 

    invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH), 
      (int) (dirtyRect.top - HALF_STROKE_WIDTH), 
      (int) (dirtyRect.right + HALF_STROKE_WIDTH), 
      (int) (dirtyRect.bottom + HALF_STROKE_WIDTH)); 

    firstX = x; 
    firstY = y; 

    return true; 

:이 캔버스에 경로를 보여주는를 들어 ArrayList를

private void saveCanvas() { 

    SaveCanvasDrawing canvasDrawing = new SaveCanvasDrawing(); 

    canvasDrawing.setPath(signaturePath); 
    canvasDrawing.setPdfPageNumber(currentPage); 
    canvasDrawing.setxAxis(firstX); 
    canvasDrawing.setyAxis(firstY); 

    mSavingCanvasDrawing.add(canvasDrawing); 

    mCanvasHashMap.put(currentPage, mSavingCanvasDrawing); 


} 

내 캔버스 경로를 절약 : 다른 블록에서이 방법에서는 내가 이것을 호출 오전 path.When 내가 다시 설정하라는 있어요 캔버스가 내 경로를 그리지 않습니다.하지만 내 경로를 디버깅 할 때 null이 아닙니다.하지만 캔버스에 경로가 표시되지 않습니다.

private void redoCanvas() { 


    if (mCanvasHashMap.containsKey(currentPage)) { 
     mDrawingPath.clear(); 
     mPageNumber.clear(); 
     for (int j = 0; j < mSavingCanvasDrawing.size(); j++) { 
      int pageNumber = mSavingCanvasDrawing.get(j).getPdfPageNumber(); 

      if (pageNumber == currentPage) { 
       float xAxis = mSavingCanvasDrawing.get(j).getxAxis(); 
       float yAxis = mSavingCanvasDrawing.get(j).getyAxis(); 
       Path path = mSavingCanvasDrawing.get(j).getPath(); 


       mDrawingPath.add(path); 
       mPageNumber.add(pageNumber); 
      } else { 
       signaturePath.reset(); 
       invalidate(); 
      } 
     } 
    } else { 
     signaturePath.reset(); 
     invalidate(); 
    } 
} 

마지막의 onDraw() : 나는 확인하고이 방법 때 내 isSignatureSelected = 거짓; 내 저장된 arraylist 경로를 호출 오전 및 드로잉 오전 내 문제는 내가 redoCanvas()에서 경로를 리셋 할 때 캔버스에 경로를 표시하지 않는 것이 었습니다. 그러나 내가 캔버스를 리셋하는 캔버스를 제거하면 내 경로가 표시되지만 모든 경로를 취하고 있습니다. from signaturePath. 보호 무효의 onDraw (캔버스 캔버스) {

if (Constants.isSignatureSelected) { 

     if (Constants.draw) { 
      canvas.drawPath(signaturePath, signaturePaint); 
     } 
    } else { 
     if (mPageNumber.contains(currentPage)) { 
      for (Path p : mDrawingPath) { 
       canvas.drawPath(p, signaturePaint); 
      } 
     } 
    } 

} 
+0

예 솔루션을 얻었습니다. computeScroll()에서 Path의 새 생성자를 만들고 onDraw()에서 경로 배열을 확인하고 경로를 캔버스에 추가하고 있습니다. – user123456

답변

0

그래, 난 solution.In computeScroll을() 나는 경로와의 onDraw() 나는 경로의 나의 배열 목록을 확인하고 내가 추가하고 새로운 생성자를 만드는 오전 있어요 캔버스에 경로

관련 문제