2014-02-09 41 views
1

我有一個SurfaceView上我正在用一個特殊的線程定期繪製一個小圓圈 但我想當我按下surfaceView線程停止繪製圓,當我壓制它的線程重新繪製圓圈。在Android中暫停和恢復SurfaceView中的線程

我試圖與線程的方法,我可以將其暫時停止其sleep()方法,但我不知道如何使用等待和通知,我甚至發現了一些exemples但並沒有從他們那裏得到幫助

我代碼:

public class GameView extends SurfaceView implements SurfaceHolder.Callback { 


private float x = 100; 
private float y = 100; 
private int radius = 20; 
private Paint paint; 
private SurfaceHolder mSurfaceHolder; 
private DrawingThread mTh ead; 
private Context myContext; 

public GameView(Context context) { 
    super(context); 
    this.myContext = context; 
    setWillNotDraw(false); 
    paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setColor(Color.GREEN); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setTextAlign(Paint.Align.LEFT); 
    mSurfaceHolder = getHolder(); 
    mSurfaceHolder.addCallback(this); 
} 


public void onDraw(Canvas canvas){ 

    canvas.drawCircle(x, y, radius, paint); 
} 



public boolean onTouchEvent(MotionEvent event) { 

    int eventaction = event.getAction(); 
    int X = (int)event.getX(); 
    int Y = (int)event.getY(); 



    switch (eventaction) { 
     case MotionEvent.ACTION_DOWN: 

      // I want to do my job here 


      break; 
     case MotionEvent.ACTION_MOVE: 
     break; 
     case MotionEvent.ACTION_UP: 

     break; 
    } 

    invalidate(); 
    return true; 
    } 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 


     mThread = new DrawingThread(mSurfaceHolder, myContext); 
     mThread.mRun = true; 
     mThread.start(); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

} 


public final class DrawingThread extends Thread { 



    public boolean att = true; 

    public long delaiAttente = 1000; 

    boolean mRun; 

    Canvas mcanvas; 

    SurfaceHolder surfaceHolder; 

    Context context; 



    public DrawingThread(SurfaceHolder sholder, Context ctx) 

    { 

    surfaceHolder = sholder; 

    context = ctx; 

    mRun = false; 
    } 



    void setRunning(boolean bRun) 

    { 

    mRun = bRun; 

    } 


    boolean keepDrawing = true; 



    @Override 
    public void run() { 
     while (keepDrawing) { 
       Canvas canvas = null; 
       try { 

         canvas = mSurfaceHolder.lockCanvas(); 
         synchronized (mSurfaceHolder) { 
          draw(canvas); 
         } 
       } 
       catch(Exception e){ 

       } 
       finally { 
         if (canvas != null) 
         mSurfaceHolder.unlockCanvasAndPost(canvas); 
       } 
       waitThreaed(); 

    } 
} 

    public void waitThreaed() { 

     try { 
        x = (float) (getWidth()*Math.random()); 
        y = (float) (getHeight()*Math.random()); 
        this.sleep(1000); 
        postInvalidate(); 
      } catch (InterruptedException e) { 

      } 
    } 
    } 

    } 

回答

0

你就不能使用這樣的:

Timer drawTimer = new Timer("draw"); 
    updateTimer.schedule(new TimerTask() { 
     public void run() { 
      draw(); 
     } 
    }, 0, 1000); 
    private void draw() { 
    runOnUiThread(new Runnable() { 
     public void run() { ...}}} 

我不明白爲什麼你需要繼承主題。

+0

是啊,我明白了,但我怎麼能夠暫停和恢復繪圖 – user3232174

+0

你想繪製而用戶觸摸和暫停發佈? –

+0

將其更改爲定時器。開始()和停止()鍵按 –