Android OnDraw()

3
我是Android的新手,我有点难以理解这个概念,所以基本上这就是我想要做的以更好地理解它:
  • 我创建了一个扩展视图的DrawShape类。在这个类中,在OnDraw()中,我创建了一个圆并用颜色填充它。

  • 从Activity中调用应用程序。//到这一步为止,我做得很好。

现在,我需要多次重新绘制圆形(蓝色、红色、黄色等)。
所以我正在阅读,最好的方法是使用线程。我也读到你需要使用postInvalidate()来重绘(我仍然不明白我应该从哪里调用它),是从Activity中调用吗?还是在OnDraw()内部调用?
希望您明白我想要实现什么,只是我没有找到一个好的教程来展示这个,如何重新绘制x次……当我使用Thread.sleep()时,一切都停止了,然后它显示我的应用程序……但现在我明白了为什么,因为我正在操作主线程。
请帮助我理解这个问题。
谢谢。
3个回答

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

0

我认为,你可以在你的活动中使用Timer和TimerTask来实现这个。TimerTask会按照你指定的延迟时间运行,当它运行时,你所要做的就是yourDrawShapeInstance.postInvalidate();

机制是这样的,因为你不在UI线程上,所以调用postInvalidate()将在UI队列中添加一个无效请求,当UI引擎捕获到你之前调用的延迟无效请求时,它会自动调用DrawShape视图的onDraw方法,并重新绘制视图。

(我没有测试过,我在这里写)

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

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();
}

很好,如果我需要重新绘制圆形,那么在run()中我可以放置类似Canvas c = new Canvas();和Paint paint = new Paint();的内容。我可以从这里做到这一点吗?你有什么建议?另外,如果我有一个扩展View的类,我可以做类似于myClass.OnDraw();的操作吗? - earm
这里有几件事情:线程应该用于更新影响画布的值,例如在游戏中移动角色的位置++x(将角色水平移动到一个位置)。您可以使用线程更改要绘制的圆的数量和要更改的颜色。通过调用postInvalidate(),canvas onDraw()函数也将被调用,因此您不需要直接调用onDraw()。此链接具有非常类似于您正在执行的代码:http://blog.goltergaul.de/2010/03/android-game-project-basics-of-threads-and-canvas/ - ice911

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接