2012-09-28 55 views
2

這段代碼應該繪製東西,但是當我移動手指時它不繪製任何東西。請幫我調試它。一個簡單的繪圖示例

@Override 

    protected void onDraw(Canvas canvas) { 
    canvas.drawPath(path, paint); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    float eventX = event.getX(); 
    float eventY = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     path.moveTo(eventX, eventY); 
     return true; 
     case MotionEvent.ACTION_MOVE: 
     path.lineTo(eventX, eventY); 
     break; 
     case MotionEvent.ACTION_UP: 
     // nothing to do 
     break; 
     default: 
     return false; 
    } 

    // Schedules a repaint. 
    invalidate(); 
    return true; 
    } 
} 
+0

有你初始化路徑,並用顏色對象作畫,你可以發佈更多的代碼.. –

+0

肯定...我只是保持簡短 – Tanvir

+0

請參閱[本](http://v4all123.blogspot.com/2013/06/drawing-example-in-android.html)完整教程。 – Gunaseelan

回答

3

試試這個

@Override 

    protected void onDraw(Canvas canvas) 
    { 
    canvas.drawPath(path, paint); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    float eventX = event.getX(); 
    float eventY = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     path.moveTo(eventX, eventY); 
     path.lineTo(eventX, eventY); 
     return true; 
     case MotionEvent.ACTION_MOVE: 
     path.quadTo(eventX, eventY, (x + eventX)/2, (y + eventY)/2); 
     break; 
     case MotionEvent.ACTION_UP: 
     canvas.drawPath(path, paint); 
     // kill this so we don't double draw 
    path.reset(); 
     break; 
     default: 
     return false; 
    } 

    // Schedules a repaint. 
    invalidate(); 
    return true; 
    } 
} 

欲瞭解更多信息,看看

http://code.google.com/p/strokesformartians/source/browse/trunk/src/se/combitech/strokesformartians/drawing/FingerPaint.java?r=120

這可能會幫助你。

+0

它是荒謬的,我的paint.setColor被設置爲WHITE在白色的背景,所以一切正常,但我倔強得到它。順便說一句,什麼是「quadTo」...我的代碼沒有這個工作。 – Tanvir

+0

如何添加一個將清除畫布的按鈕,我只需要清除行的代碼.. – Tanvir

1

這是我的工作示例,您可以自由地繪製。

public class CanvasDrawingActivity extends Activity 
{ 
    private ArrayList<Path> _graphics = new ArrayList<Path>(); 
    private Paint mPaint; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(new DrawingPanel(this)); 
     mPaint = new Paint(); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFFFF00); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(3); 

    } 

    class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback 
    { 
     private DrawingThread _thread; 
     private Path path; 

     public DrawingPanel(Context context) 
     { 
      super(context); 
      getHolder().addCallback(this); 
      _thread = new DrawingThread(getHolder(), this); 
     } 


     public boolean onTouchEvent(MotionEvent event) 
     { 
      synchronized (_thread.getSurfaceHolder()) { 
       if(event.getAction() == MotionEvent.ACTION_DOWN){ 
        path = new Path(); 
        path.moveTo(event.getX(), event.getY()); 
        path.lineTo(event.getX(), event.getY()); 
       }else if(event.getAction() == MotionEvent.ACTION_MOVE){ 
        path.lineTo(event.getX(), event.getY()); 
       }else if(event.getAction() == MotionEvent.ACTION_UP){ 
        path.lineTo(event.getX(), event.getY()); 
        _graphics.add(path); 
       } 

       return true; 
      } 
     } 

     @Override 
     public void onDraw(Canvas canvas) { 
      for (Path path : _graphics) { 
       //canvas.drawPoint(graphic.x, graphic.y, mPaint); 
       canvas.drawPath(path, mPaint); 
      } 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
            int height) { 
      // TODO Auto-generated method stub 

     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      _thread.setRunning(true); 
      _thread.start(); 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      boolean retry = true; 
      _thread.setRunning(false); 
      while (retry) { 
       try { 
        _thread.join(); 
        retry = false; 
       } catch (InterruptedException e) { 
        // we will try it again and again... 
       } 
      } 
     } 
    } 

    class DrawingThread extends Thread { 
     private SurfaceHolder _surfaceHolder; 
     private DrawingPanel _panel; 
     private boolean _run = false; 

     public DrawingThread(SurfaceHolder surfaceHolder, DrawingPanel panel) { 
      _surfaceHolder = surfaceHolder; 
      _panel = panel; 
     } 

     public void setRunning(boolean run) { 
      _run = run; 
     } 

     public SurfaceHolder getSurfaceHolder() { 
      return _surfaceHolder; 
     } 

     @Override 
     public void run() { 
      Canvas c; 
      while (_run) { 
       c = null; 
       try { 
        c = _surfaceHolder.lockCanvas(null); 
        synchronized (_surfaceHolder) { 
         _panel.onDraw(c); 
        } 
       } finally { 
        // do this in a finally so that if an exception is thrown 
        // during the above, we don't leave the Surface in an 
        // inconsistent state 
        if (c != null) { 
         _surfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
    } 
} 

輸出將是如下,

enter image description here

+0

不錯但TOOOO沉重像我這樣的初學者:D – Tanvir

+0

如何添加一個將清除畫布的按鈕,我只需要代碼清除行.. – Tanvir

+0

如何保存我的手勢..? – GaneshKumar