2012-06-23 3 views
0

내가 그리는 응용 프로그램을 개발하고있다, 그것은 다음 코드가 :멀티 스레딩을 사용하여 Canvas에서 그리는 방법은 무엇입니까?

public class PainterView extends View implements DrawingListener { 

private Context context; 
private Painter painter; 
private Bitmap background; 
private Bitmap bitmap; 
private Paint bitmapPaint; 
private Path path; 
private Paint paint; 

private float x; 
private float y; 

public PainterView(Context context, Painter painter) { 

    super(context); 
    this.context = context; 
    this.painter = painter; 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    if (bitmap != null) { 
     canvas.drawBitmap(background, 0, 0, bitmapPaint); 
     canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); 
     canvas.drawPath(path, paint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     painter.touchStart(x, y); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     painter.touchMove(x, y); 
     break; 
    case MotionEvent.ACTION_UP: 
     painter.touchUp(); 
     break; 
    } 
    return true; 
} 

@Override 
public void onPictureUpdate(Bitmap background, Bitmap bitmap, Paint bitmapPaint, Path path, Paint paint) { 
    this.background=background; 
    this.bitmap = bitmap; 
    this.bitmapPaint = bitmapPaint; 
    this.path = path; 
    this.paint = paint; 
    invalidate(); 
} 

public void setPainter(Painter painter) { 
    this.painter = painter; 
} 
} 

이 코드는 모든 터치 이벤트를 잡는다는 모델이 이벤트를 보내,이 좌표를 저장하고 도면에 대해 볼 수있는 비트 맵을 보내 .

나는이 코드를 사용하고 있지만 잘 작동하고 있지만 내 클라이언트는 그림이 매끄러운 부분이 아니라는 것을 나에게 알려줍니다. 그래서 그것을 위해 멀티 쓰레딩을 사용해야합니다. 제발, 어떻게 할 수 있니? 또는 다른 방법을 사용하여 생산성을 향상시킬 수 있습니까?

답변

0

여기에 내가 구현 방법에 대한 기본 골격은 당신이 원하는 무엇 :

public class Drawing extends Activity implements OnTouchListener{ 

    DrawPanel dp; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     dp = new DrawPanel(this); 
     dp.setOnTouchListener(this); 
      // do other stuff you want 
      setContentView(dp); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     dp.pause(); 
    } 



    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     dp.resume(); 
    } 

    public class DrawPanel extends SurfaceView implements Runnable{ 

     Thread t = null; 
     SurfaceHolder holder; 
     boolean isItOk = false ; 

     public DrawPanel(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
      holder = getHolder(); 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(isItOk == true){ 

       if(!holder.getSurface().isValid()){ 
        continue; 
       } 

       Canvas c = holder.lockCanvas(); 
       c.drawARGB(255, 0, 0, 0); 
       onDraw(c); 
       holder.unlockCanvasAndPost(c); 
      } 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      // TODO Auto-generated method stub 
      super.onDraw(canvas); 
        // do your drawing stuff here 
      } 
     } 

     public void pause(){ 
      isItOk = false; 
      while(true){ 
       try{ 
        t.join(); 
       }catch(InterruptedException e){ 
        e.printStackTrace(); 
       } 
       break; 
      } 
      t = null; 
     } 

     public void resume(){ 
      isItOk = true; 
      t = new Thread(this); 
      t.start(); 

     } 




    } 


    @Override 
    public boolean onTouch(View v, MotionEvent me) { 
    // capture your coordinates here   
    return true; 

    } 


} 
관련 문제