Android OnDraw()

时间:2011-02-04 13:53:43

标签: android

我是Android的新手,我无法理解这个概念所以基本上这就是我想要做的更好地理解它..

  • 我创建了一个扩展视图的DrawShape类。在OnDraw()的这个类中,我创建了一个圆并用颜色填充它。

  • 从我调用该应用程序的Activity中。 //在此之前我做得很好。

现在,我需要多次重新绘制圆圈(蓝色,红色,黄色等......)

所以我正在阅读,最好的方法是使用Threads ..我还读过你需要使用postInvalidate()来重绘(我仍然不明白我应该在哪里调用这个)是从Activity调用的吗?或者在OnDraw()中?。

希望你明白我想要完成的事情,就是我没有找到一个很好的教程来展示这个,如何重新绘制x次...当我做Thread.sleep()时它会停止然后它显示我的应用..但现在我理解为什么,因为我正在玩主线程。

请帮我理解这个..

谢谢

3 个答案:

答案 0 :(得分:3)

我做了类似这样的事情

animcolor()
{
Timer timer = new Timer();
int delay =  ...;
int period = ...;
timer.schedule(new TimerTask(){
   run() { 
         setColor( randomint() ); ) 
         customview.postInvalidate();
   }
}, delay, period);

线程?没有必要创造它们;定时器在并发方面做得很好。

...而且代码看起来有点......

res/layout/file.xml

<org.customviewlayout a:id="@+id/customlayout"/>



src/org.MyActivity.java


class MyActivity 
{
  onCreate()
  {
    customlayout = findViewById(R.id.customlayout);
    customlayout.animcolor();
   }
}

src/org.customlayout.java

import org.customview;
class customlayout
{
  customview;

  customlayout(context, attrs)
  {
    customview = new customview();
    addview(customview);  // so it's onDraw() method will be called
  }

  onlayout(...)
  {
    customview.layout(...);
  }

  animcolor()
  {
    Timer timer = new Timer();
    int delay =  ...;
    int period = ...;
    timer.schedule(new TimerTask(){
       run() { 
           setColor( randomint() ); ) 
           customview.postInvalidate();
       }
    }, delay, period);

  }

  setcolor(int)
  {
    ....
  }
}

答案 1 :(得分:0)

我认为,您可以使用活动中的Timer和TimerTask来完成此操作。 TimerTask以你指定的延迟运行,当你运行时你要做的就是yourDrawShapeInstance.postInvalidate();

机制是这样的,因为你不在ui线程上调用postInvalidate()来在ui队列上添加一个invalidate,当ui引擎选择你之前调用的延迟invalidate时,然后自动调用你的onDraw方法DrawShape视图和视图将被重绘。

(我不测试这个,我在这里写)

TimerTask task = new TimerTask(){
  public void run(){
    myDrawShapeInstance.postInvalidate();
  }
}

答案 2 :(得分:0)

绘图时,始终使用远离主线程的线程,并在线程完成后始终无效(大部分时间 - 显示绘图的当前结果)。您可能会从某些与用户相关的事件中调用绘图函数,因此请确保为该绘图过程创建另一个线程。按照这些规则,你会没事的。

void drawCircleToCanvas(int color)
{
final Handler handler = new Handler() {
           public void handleMessage(Message msg) {
              myDrawShapeInstance.postInvalidate();
              }
           };
        Thread updateUI = new Thread() {  
           public void run() {

           //************draw something here***************

              handler.sendEmptyMessage(0);
              }
           };
          updateUI.start();
}