2012-03-19 5 views
3

내 페인트에서 하나의 페인트 앱을 준비했습니다. 어떤 것이 든 그릴 수 있습니다. 잘 작동합니다. 지우개 페인트를 지우려면 손가락 지우기를 준비하십시오. 다음 코드를 준비했습니다.안드로이드에서 손가락 지우개를 구현하는 방법은 무엇입니까?

이 코드는

mMyPaint.setOnTouchListener(new OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if(paintAndEraserFlag==0){ 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        // path = new Path(); 
        mPath.moveTo(event.getX(), event.getY()); 
        mPath.lineTo(event.getX(), event.getY()); 
        mArryLstPath.add(mPath); 
       } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
        mPath.lineTo(event.getX(), event.getY()); 

       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        mPath.lineTo(event.getX(), event.getY()); 
       } 
       }else if(paintAndEraserFlag==1){ 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        // path = new Path(); 
         System.out.println("in path---"); 
        mPath.moveTo(event.getX(), event.getY()); 
        mPath.lineTo(event.getX(), event.getY()); 
        mArryLstEarser.add(mEraserPath); 
       } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
        mPath.lineTo(event.getX(), event.getY()); 

       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        mPath.lineTo(event.getX(), event.getY()); 
       } 
       } 

       mMyPaint.invalidate(); 
       return true; 

      } 
     }); 

내 페인트 및 지우개 객체,

mPaint.setDither(true); 
     mPaint.setColor(0xFFD2691E); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(30); 

     mEraser.setDither(true); 
     mEraser.setStyle(Paint.Style.STROKE); 
     mEraser.setStrokeJoin(Paint.Join.ROUND); 
     mEraser.setStrokeCap(Paint.Cap.ROUND); 
     mEraser.setStrokeWidth(15); 
     mEraser.setColor(0x00000000); 

이 있습니다 사용자 지정보기에 내 무승부에 방법,

public void onDraw(Canvas canvas) { 

     if (myDrawBitmap == null) { 
      myDrawBitmap = Bitmap.createBitmap(480, 800, 
        Bitmap.Config.ARGB_8888); 
      mBmpDrawCanvas = new Canvas(myDrawBitmap); 
      mIntDrawArray = new int[myDrawBitmap.getWidth() 
        * myDrawBitmap.getHeight()]; 
     } 

     if (mBmpDrawCanvas != null) { 
      myDrawBitmap.getPixels(mIntDrawArray, 0, myDrawBitmap.getWidth(), 
        0, 0, myDrawBitmap.getWidth(), myDrawBitmap.getHeight()); 
      if (MyEraserActivity.paintAndEraserFlag == 0) { 
       for (Path path : MyEraserActivity.mArryLstPath) { 

        mBmpDrawCanvas.drawPath(MyEraserActivity.mPath, mPaint); 

       } 
      } else if (MyEraserActivity.paintAndEraserFlag == 1) { 
       for (Path path : MyEraserActivity.mArryLstEarser) { 

        mBmpDrawCanvas.drawPath(MyEraserActivity.mEraserPath, 
          mEraser); 
        System.out.println("in eraser---"); 
       } 
      } 
      if (myDrawBitmap != null) 
       canvas.drawBitmap(myDrawBitmap, 0, 0, null); 

     } 

    } 

그려진 페인트가 있으면 터치하는 부분을 지우고 싶습니다. 저를 도와주세요. 그것은 수도

답변

1

는 당신을 도와줍니다 : 비트 맵이하는 동안

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
+0

는, u는 볼 수있는보기의 캔버스에 그 비트 맵을 그리기 질문 나는 stackoverflow에 게시했습니다. http://stackoverflow.com/questions/16229496/eraser-with-porterduff-mode-clear-always-draws-a-transparent-line – AndroidDev

0

캔버스 지우개를 지원하지 않습니다.

기본 해결 흐름 :

  1. 만들기 다른 캔버스

  2. 그 캔버스

    public void init(int width, int height) { 
        Log.i(TAG,"init with "+width+"x"+height); 
        foreground = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
        cacheCanvas = new Canvas(); 
        cacheCanvas.setBitmap(foreground); 
    } 
    
  3. 기록이의 접촉에 비트 맵

  4. 설정을 비트 맵 만들기 비트 맵, 페인트 및 지우개

    public boolean onTouchEvent(MotionEvent event) { 
    // Log.i(TAG,"onTouch detected"); 
    float eventX = event.getX(); 
    float eventY = event.getY(); 
    
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
        currentStroke = new Stroke(); 
        currentStroke.color = paint; 
        currentStroke.path.moveTo(eventX, eventY); 
        currentStroke.path.lineTo(eventX, eventY); 
    
        synchronized (strokes) { 
         strokes.add(currentStroke); 
        } 
        lastTouchX = eventX; 
        lastTouchY = eventY; 
        // There is no end point yet, so don't waste cycles invalidating. 
        return true; 
    
    case MotionEvent.ACTION_MOVE: 
    case MotionEvent.ACTION_UP: 
        // Start tracking the dirty region. 
        resetDirtyRect(eventX, eventY); 
    
        // When the hardware tracks events faster than they are delivered, 
        // the 
        // event will contain a history of those skipped points. 
        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 (i == 0) { 
          lastX = historicalX; 
          lastY = historicalY; 
          currentStroke.path.lineTo(historicalX, historicalY); 
         } else { 
          currentStroke.path.quadTo(lastX, lastY, 
            (historicalX + lastX)/2, 
            (historicalY + lastY)/2); 
         } 
        } 
    
        // After replaying history, connect the line to the touch point. 
        if(historySize==0){ 
         long duration=event.getEventTime()-event.getDownTime(); 
         float offset=0.1f; 
         if(duration<300){ 
          offset=50.0f/duration; 
         } 
         currentStroke.path.lineTo(eventX+offset, eventY+offset); 
        }else{ 
         currentStroke.path.lineTo(eventX, eventY); 
        } 
        synchronized (strokes) { 
         strokes.add(currentStroke); 
        } 
    
        break; 
    
    default: 
        // Log.i(TAG,"Ignored touch event: " + event.toString()); 
        return false; 
    } 
    
    // Include half the stroke width to avoid clipping. 
    float width = paint.getStrokeWidth()/2; 
    invalidate((int) (dirtyRect.left - width), 
         (int) (dirtyRect.top - width), (int) (dirtyRect.right + width), 
         (int) (dirtyRect.bottom + width)); 
    
    lastTouchX = eventX; 
    lastTouchY = eventY; 
    
    return true; 
    } 
    
  5. 내가 u는 여기에서 언급하지만이 코드에 몇 가지 문제가 동일한 코드를 사용하고

    protected void onDraw(Canvas canvas) { 
    // Log.i(TAG,"onDraw called"); 
    synchronized (strokes) { 
        if (strokes.size() > 0) { 
         for (Stroke s : strokes) { 
          cacheCanvas.drawPath(s.path, s.color); 
         } 
         canvas.drawBitmap(foreground, 0, 0, null); 
         strokes.clear(); 
        } 
    } 
    } 
    
관련 문제