2013-05-04 5 views
3

도면의 캔버스를 이미 설정했습니다. 내 문제는 이제 그림을 지우는 방법입니다.안드로이드에서 캔버스의 도면을 지우는 법

아무 소용이 시도.

public void clear() 
{ 
    circlePath.reset(); 
    mPath.reset(); 
    // Calls the onDraw() method 
    //invalidate(); 
} 

여기에 전체 코드를 살펴 보시기 바랍니다 :

https://gist.github.com/akosijiji/a29cca90bead2e5e35ad

어떤 도움도 정말 감사합니다. 버튼 클릭

b1.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      dv.clear(); // call clear method using in your custom view 


     } 

    }); 

+0

아래 내용을 시도하고 작동하는지 알려주세요. 싱글 톤 클래스를 사용하여 그리기 도구를 초기화하는 것이 좋습니다. – Raghunandan

답변

5

모든 그리기 도구 사용자 정의보기에

  public void clear() 
     { 
      mBitmap = Bitmap.createBitmap(width,height , 
        Bitmap.Config.ARGB_8888); 

     mCanvas = new Canvas(mBitmap); 
     mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

      //Added later.. 
     mPaint = new Paint(); 
      mPaint.setAntiAlias(true); 
      mPaint.setDither(true); 
      mPaint.setColor(Color.GREEN); 
      mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 
      invalidate(); 
     } 

재설정을 명확한 방법을 정의하고보기를 새로 고침 무효화 호출.

전체 작업 코드

public class MainActivity extends Activity implements ColorPickerDialog.OnColorChangedListener { 

DrawingView dv ; 
RelativeLayout rl; 
    private Paint  mPaint; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dv = new DrawingView(this); 
    setContentView(R.layout.activity_main); 
    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.GREEN); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(12); 
    rl = (RelativeLayout) findViewById(R.id.rl); 
    rl.addView(dv); 
    Button b = (Button) findViewById(R.id.button1); 
    //b.setText(R.string.France); 
    Button b1 = (Button) findViewById(R.id.button2); 
    rl.setDrawingCacheEnabled(true); 
    b.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
       // dv.clear();  
      new ColorPickerDialog(MainActivity.this, MainActivity.this, mPaint.getColor()).show(); 


     } 

    }); 

    b1.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      dv.clear(); 


     } 

    }); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public class DrawingView extends View { 

     private int width; 
     private int height; 
     private Bitmap mBitmap; 
     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mBitmapPaint; 
     Context context; 
     private Paint circlePaint; 
     private Path circlePath; 

     public DrawingView(Context c) { 
     super(c); 
     context=c; 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     circlePaint = new Paint(); 
     circlePath = new Path(); 
     circlePaint.setAntiAlias(true); 
     circlePaint.setColor(Color.BLUE); 
     circlePaint.setStyle(Paint.Style.STROKE); 
     circlePaint.setStrokeJoin(Paint.Join.MITER); 
     circlePaint.setStrokeWidth(4f); 


     } 

     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     width =w; 
     height =h; 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 

     } 
     public void clear() 
     { 
      mBitmap = Bitmap.createBitmap(width,height , 
        Bitmap.Config.ARGB_8888); 

       //Log.d("BITMAP","Restoring..."); 
       //mBitmap=BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

      mCanvas = new Canvas(mBitmap); 

      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

      //Added later.. 
      mPaint = new Paint(); 
      mPaint.setAntiAlias(true); 
      mPaint.setDither(true); 
      mPaint.setColor(Color.GREEN); 
      mPaint.setStyle(Paint.Style.STROKE); 
      mPaint.setStrokeJoin(Paint.Join.ROUND); 
      mPaint.setStrokeCap(Paint.Cap.ROUND); 
      mPaint.setStrokeWidth(12); 
      invalidate(); 
     } 
     @Override 
     protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     canvas.drawPath(mPath, mPaint); 

     canvas.drawPath(circlePath, circlePaint); 
     } 

     private float mX, mY; 
     private static final float TOUCH_TOLERANCE = 4; 

     private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
     } 
     private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 

      circlePath.reset(); 
      circlePath.addCircle(mX, mY, 30, Path.Direction.CW); 
      // invalidate(); 

     } 
     } 
     private void touch_up() { 
     mPath.lineTo(mX, mY); 
     circlePath.reset(); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
     // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));//.Mode.SCREEN)); 
     mPaint.setMaskFilter(null); 
     mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.SCREEN); 

     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
       invalidate(); 
       break; 
     } 
     return true; 
     } 
     } 
@Override 
public void colorChanged(int color) { 
    // TODO Auto-generated method stub 
    mPaint.setColor(color); 
} 
} 

위의 작동하지만 당신은 당신이 페인트 객체와 같은 객체를 생성합니다 삭제해야 좋은 디자인의 사촌 매번 없습니다.

당신은 싱글 톤 클래스를 만들고 도구는 당신의 그림 클래스에서

public class DrawingManager { 

private static DrawingManager mInstance=null; 

public DrawingTools mDrawingUtilities=null; 

public int mThemeIndex; 

    public Canvas mCanvas; 


    public Path mPath; 

    public Paint mBitmapPaint; 

    public Bitmap mBitmap; 

    public Paint mPaint; 

private DrawingManager() 
{ 

    resetDrawingTools(); 
} 

public static DrawingManager getInstance() 
{ 
    if(mInstance==null) 
    { 
     mInstance=new DrawingManager();   
    } 

    return mInstance; 
} 


public void resetDrawingTools() 
{ 

    mBitmap = Bitmap.createBitmap(screenwidth,screenheight , 
      Bitmap.Config.ARGB_8888) 

    mCanvas = new Canvas(mBitmap); 

    Path = new Path(); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

    //Added later.. 
    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.Green); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(12); 


} 

/** 
* Clears the drawing board. 
*/ 
public static void clearDrawingBoard() 
{ 
    mInstance=null; 
} 



public void resetBitmapCanvasAndPath() { 
    // TODO Auto-generated method stub 
    mBitmap = Bitmap.createBitmap(screenwidth,screenheight , 
      Bitmap.Config.ARGB_8888); 

     //Log.d("BITMAP","Restoring..."); 
     //mBitmap=BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

    mCanvas = new Canvas(.mBitmap); 

    mPath = new Path(); 
} 
} 

을 무효로 재설정 한 후 호출 할 수 있습니다

다음
 private DrawingManager mDrawingManager=null; 
     mDrawingManager=DrawingManager.getInstance();// initialize drawing tools once 

버튼을 그릴 취소합니다

 mDrawingManager.resetBitmapCanvasAndPath(); 
     invalidate(); 
+0

그래서 DrawingManager 클래스를 분리해야합니까? –

+0

아니, 드로잉 도구를 초기화하고 끌기를 지우는 별도의 클래스가 있어야합니다. 그 클래스를 싱글 톤으로 만듭니다. 나머지 코드는 동일 할 수 있습니다. 그것의 더 나은 디자인. 첫 번째 접근 방식은 작동하지만 무효화를 호출하여 새로 고침 할 때마다 불필요한 객체를 생성합니다. – Raghunandan

+0

또한 PorterDuff은 무엇입니까? –

0

당신은 당신의 paintlayout.removeallviews()를 사용해야합니다;

당신은 그림 캔버스 클래스에 하나의 레이아웃을 추가했을 것입니다. 도면 레이아웃에서 모든 뷰를 제거 할 수 있습니다. 이것이 당신을 도울 수 있기를 바랍니다.

관련 문제