2013-10-22 17 views
0

我有一个包含用户的绘图视图。当点击“播放”按钮时,我想要一个从开始到结束绘制图像的循环。Android的 - 触发一个循环,在听众多次重绘(力无效即使UI线程繁忙)

在试图做到这一点我基本都播放按钮,基本上无效的观点,等待一个onClickListener的内部循环,将下一个点的集合,并再次无效。

的问题是图像实际上并不重绘,直到之后的整个图像绘制。所以基本上什么都没有发生,然后突然完成。之后做一些研究,我的假设是无效说的是主UI线程重绘时,得到的时间,但它已经挂了对付监听器,所以它实际上并没有画,直到循环结束。我试过直接调用onDraw,使用postInvalidate,以及其他我可以想到的荒谬的事情,但我不知道如何让这个工作。

下面是一些代码片段:

在我PaintActivity(其中有一个PaintAreaView) 洗涤器指示绘制的进度。当我手动使用搜索栏时,onProgressChanged中的第一行可用,但在按下play时不起作用,这就是为什么我尝试添加所有额外内容的原因。

 _scrubber.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      _paintAreaView.setPointsToDraw(_scrubber.getProgress()); 
      _paintAreaView.invalidate(); 
      _mainViewGroup.invalidate(); 
      _paintAreaView.postInvalidate(); 
      _mainViewGroup.postInvalidate(); 
      _paintAreaView.drawPoints(_paintAreaView.getCanvas()); 
      _paintAreaView.invalidate(); 
     }... 

我的播放按钮的东西:

 play.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ... 
      playDrawing(); 
      ... 
     } 
    }); 

    private void playDrawing() 
{ 
    int endPoint = getPaintPointCount(); 

    while(_scrubber.getProgress() < endPoint) 
    { 
     _scrubber.incrementProgressBy(1); 

     try{ 
      Thread.sleep(10); 
     }catch(InterruptedException e) 
     { 
      Thread.currentThread().interrupt(); 
     } 
     //_paintAreaView.setPointsToDraw(_scrubber.getProgress()); 
     //_paintAreaView.invalidate(); 
     //_mainViewGroup.invalidate(); 
     if(_isPaused) 
      break; 
    } 
} 

我不使用的睡眠一个巨大的风扇,但我已经与其他解决方案挣扎,这就是我接下来要做的研究。但对于这个问题,增加进度条没有成功调用onProgressChanged,但同样它只是不绘制视图,直到它的是播放键点击监听器的。

如果我不得不等待,直到我离开听众才能使其工作,我已经足够新了,我不知道我会如何处理这个问题。

对不起,我糟糕的代码,任何的帮助深表感谢帮助我了解这里发生了什么,我需要了解得到这个工作是什么。

谢谢!

回答

0

我得到它的工作,我不知道如果我所做的一切都是必要的,但这里是基于我的主UI线程理论成为问题所做的更改。

我创建了一个Thread类的成员变量:

private Thread _drawThread; 

在的onCreate():

_drawThread = new Thread(){ 
    public void run(){ 
     playDrawing(); 
    } 
}; 

播放按钮的onClick:

play.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     ... 
     _drawThread.start(); 
    } 
}); 

似乎是在做我想要的东西, !除了应用程序崩溃,我第二次玩游戏:)从这里我不认为这将是不好的解决这个问题,虽然。

编辑----- 在我的播放按钮onClickListener创建线程,而不是它是一个成员变量修复了崩溃。我错误地认为一旦监听器超出了主线程的范围,线程就会被销毁,但我想不是这种情况。