首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓OnDraw()

安卓OnDraw()
EN

Stack Overflow用户
提问于 2011-02-04 13:53:42
回答 3查看 6.4K关注 0票数 3

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

  • I创建了一个扩展视图的DrawShape类。在OnDraw()中的这个类中,我创建了一个圆圈,并在其中填充了一个颜色.
  • ,来自我正在调用的应用程序的活动。//在此之前,我做得很好。

现在,我需要多次重新粉刷圆圈(蓝色,红色,黄色等)

所以我在阅读,最好的方法是使用线程。我还读到您需要使用postInvalidate()重绘(我仍然不知道应该从哪里调用它),这是从活动中调用的还是在OnDraw()中调用的?

希望你能理解我想要完成的事情,只是我还没有找到一个很好的教程来展示这一点,如何重新画一些x倍的东西。当我做Thread.sleep()时,它都会停止,然后它会显示我的应用程序。但现在我明白为什么了,因为我在玩主线。

请帮我理解一下..。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-06-14 02:07:51

我做了这样的事

代码语言:javascript
复制
animcolor()
{
Timer timer = new Timer();
int delay =  ...;
int period = ...;
timer.schedule(new TimerTask(){
   run() { 
         setColor( randomint() ); ) 
         customview.postInvalidate();
   }
}, delay, period);

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

..。代码看起来有点像..。

res/layout/file.xml

代码语言:javascript
复制
<org.customviewlayout a:id="@+id/customlayout"/>



src/org.MyActivity.java


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

src/org.customlayout.java

代码语言:javascript
复制
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)
  {
    ....
  }
}
票数 3
EN

Stack Overflow用户

发布于 2011-02-04 14:16:03

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

其机制是这样的,因为在您调用的ui线程上没有调用postInvalidate()来在ui队列中添加无效信息,当ui引擎选择之前调用的延迟无效时,然后自动调用DrawShape视图的onDraw方法,视图将被重新绘制。

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

代码语言:javascript
复制
TimerTask task = new TimerTask(){
  public void run(){
    myDrawShapeInstance.postInvalidate();
  }
}
票数 0
EN

Stack Overflow用户

发布于 2011-02-04 15:47:29

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

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4898722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档