【问题标题】:Pausing and resuming thread in SurfaceView in Android在 Android 的 SurfaceView 中暂停和恢复线程
【发布时间】:2014-02-09 11:25:31
【问题描述】:

我有一个 SurfaceView,它定期用特殊线程绘制一个小圆圈 但我想当我按下surfaceView时,线程停止绘制圆圈,当我按下它时,线程再次恢复绘制圆圈。

我尝试了线程方法,我可以用它的 sleep() 方法暂时停止它,但我不明白如何使用等待和通知,我什至找到了一些示例但没有得到他们的帮助

我的代码是:

    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) {

            }
    }
   }

    }

【问题讨论】:

    标签: android


    【解决方案1】:

    你不能只使用这样的东西吗:

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

    我不明白你为什么需要子类化 Thread。

    【讨论】:

    • 是的,我明白这一点,但我怎样才能暂停和恢复绘图
    • 您想在用户触摸并在释放时暂停绘制?
    • 将其更改为计时器。按键时开始()和停止()
    • 不,我想听这样的触摸事件:当用户触摸时,如果我正在绘制,则停止绘制;如果我正在停止绘制,则重新绘制
    • 对不起,我刚刚看到你的代码,但我从来没有使用过计时器,所以我想知道如何请 thnxx
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多