Android OnDraw()

Android OnDraw(),android,Android,我是Android新手,我很难理解这个概念,所以基本上我想做的就是更好地理解它 我创建了一个DrawShape类来扩展视图。在OnDraw()中的这个类中,我创建了一个圆并用颜色填充它 从活动中,我调用应用程序//到目前为止,我做得很好 现在,我需要多次重新绘制圆(蓝色、红色、黄色等) 所以我在阅读,最好的方法是使用线程。。我还了解到,您需要使用postInvalidate()重新绘制(我仍然不明白应该从何处调用它),这是从活动中调用的,还是在OnDraw()中调用的 希望你能理解我想要完成

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

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

  • 从活动中,我调用应用程序//到目前为止,我做得很好

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

所以我在阅读,最好的方法是使用线程。。我还了解到,您需要使用postInvalidate()重新绘制(我仍然不明白应该从何处调用它),这是从活动中调用的,还是在OnDraw()中调用的

希望你能理解我想要完成的,只是我还没有找到一个好的教程来展示这一点,如何重画x次。。当我执行Thread.sleep()时,它会停止运行,然后显示我的应用程序。。但现在我明白了原因,因为我在玩主线

请帮我理解这一点


谢谢

我想,您可以在活动中使用计时器和计时器任务来完成此操作。TimerTask以指定的延迟运行,运行时只需执行DrawShapeInstance.postInvalidate()

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

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


绘制时,始终使用远离主线程的线程,并且始终在线程完成后使其无效(在大多数情况下,显示绘制的当前结果)。您可能会从一些与用户相关的事件中调用绘图函数,因此请确保正在为该绘图过程创建另一个线程。遵守这些规则,你会没事的

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

我做了这样的事

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

很好,如果我需要重新绘制圆,那么在run()中我可以放置Canvas c=newcanvas()之类的内容;和油漆=新油漆();我能在这里做这个吗?你有什么建议?还有,如果我有一个扩展视图的类,我能做一些像myClass.OnDraw()这样的事情吗?这里有两件事:应该使用线程来更新影响画布的值。例如在游戏中移动角色的位置++x(将角色水平移动到某个位置)。您可以使用该线程更改要绘制的圆数的值以及要将其更改为的颜色。通过调用postInvalidate(),也将调用canvas onDraw()函数,因此不需要直接调用onDraw()。此链接的代码与您正在执行的操作非常相似:
<org.customviewlayout a:id="@+id/customlayout"/>



src/org.MyActivity.java


class MyActivity 
{
  onCreate()
  {
    customlayout = findViewById(R.id.customlayout);
    customlayout.animcolor();
   }
}
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)
  {
    ....
  }
}