android onDraw问题

xiaoxue00941 2010-08-17 06:12:39
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setColor(Color.RED);

canvas.drawRect(x-25, y-25, x+25, y+25, p);
super.onDraw(canvas);
}


onDraw方法是怎么调用的,和postInvalidate()有什么关系?
为什么有时候运行,会onDraw执行两次??? 是应为组件没加载完吗?


请教~~~~~~~~~~~~~~~~~~
...全文
13338 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwer470148341 2013-01-08
  • 打赏
  • 举报
回复
你有没有设置横屏开发或者竖屏开发,去测试一下activity有没有两次create
哥特式寂寞 2013-01-06
  • 打赏
  • 举报
回复
seventhfox1 2012-04-10
  • 打赏
  • 举报
回复
这段代码要怎么才能跑起来啊
dinko321 2011-08-26
  • 打赏
  • 举报
回复
执行2次的原因是因为你最后用了父类的ondraw

也就是 super.onDraw

去掉这个就好了
jxcyly1985 2011-08-10
  • 打赏
  • 举报
回复
两次三次都正常的 内部做了什么onlayout onmeasure什么的都可能引起重绘
gfdyes2 2011-08-02
  • 打赏
  • 举报
回复
我也遇到onDraw()多运行一次的情况了 lz知道原因么
AnshuWang 2011-03-09
  • 打赏
  • 举报
回复
反复调用嘛!!!
qminglin 2011-03-09
  • 打赏
  • 举报
回复
postInvalidate() 是自动重绘
xqhrs232 2011-03-09
  • 打赏
  • 举报
回复
看来很挺复杂的啊!
xiaoxue00941 2010-08-18
  • 打赏
  • 举报
回复
呵呵,写了super.onDraw(canvas),有时候也会执行一次。

还有一个问题。

public class myView extends View implements Runnable{

public myView(Context context) {
super(context);
new Thread(this).start();
}


@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setColor(Color.RED);

canvas.drawRect(x-25, y-25, x+25, y+25, p);
super.onDraw(canvas);
}

public void run() {

while(true){
try {
update();//逻辑
postInvalidate();
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

}
怎么让run和onDraw同步???
ccll_4177 2010-08-18
  • 打赏
  • 举报
回复
我觉得是不是你把 super.onDraw(canvas) 写在了最后的原因,我一般是写在第一行的,这个我没试过,LZ试试
freshui 2010-08-18
  • 打赏
  • 举报
回复
postInvalidate -》 重绘请求

onDraw -> 响应该请求
yangxxss 2010-08-18
  • 打赏
  • 举报
回复
super.onDraw(canvas)这个是不是应该去掉。
new 一个View时,自动调用一个onDraw(),在 onDraw()里再写super.onDraw(canvas),就调用两次了。
下面是我的一段简单的程序段:
protected void onDraw(Canvas can){

int[] colors = new int[20*20];
for(int i = 0;i < 20*20;i++){
colors[i] = 0xff8c00;
}
Bitmap bt = Bitmap.createBitmap(colors, 20, 20, Bitmap.Config.RGB_565);

can.drawColor(Color.BLUE);
can.drawBitmap(bt, 0, 0, null);
}
xiaoxue00941 2010-08-18
  • 打赏
  • 举报
回复
public class testActivity extends Activity {
myView mv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mv = new myView(this);
setContentView(mv);
}
}

public class myView extends View{
public myView(Context context) {
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setColor(Color.RED);

canvas.drawRect(x-25, y-25, x+25, y+25, p);
super.onDraw(canvas);
}
}
ccll_4177 2010-08-18
  • 打赏
  • 举报
回复
那只能说你的Activity里的线程有问题了,你初始化的时候就会调用onDraw(),然后每次画图都要调用onDraw ,postInvalidate 一般写在进程中,用来使当前View失效,然后重新调用 onDraw 进行绘图。

你把代码贴全,肯定是逻辑方面有问题,你在检查下,
xiaoxue00941 2010-08-18
  • 打赏
  • 举报
回复
View里什么也没有,也没调用postInvalidate,只有一个onDraw方法,测试的时候,本来onDraw应该执行一次,有时候会执行两次。

有的说是android组件没加载完,他的组件加载会调用onDraw,所以就执行了两次,我想知道本质是什么,为什么会执行两次,到底系统是怎么调用onDraw的?????
yangxxss 2010-08-18
  • 打赏
  • 举报
回复
那你不写run()那它会不会进入onDraw()呢
xiaoxue00941 2010-08-18
  • 打赏
  • 举报
回复
好像是先进入run方法,然后postinvalidate进入onDraw,就会出现那个问题
yangxxss 2010-08-18
  • 打赏
  • 举报
回复
应该不会吧,按顺序来说,应该是先进入onDraw()的,如果没有synchronized那么,run()不一定会等它onDraw()执行完就开始执行,如果有synchronized,run()肯定得等onDraw()执行完后,再执行。
xiaoxue00941 2010-08-18
  • 打赏
  • 举报
回复
有可能postInvalidate()重绘请求刚一发出,onDraw还没开始执行,run本次循环就结束了,有synchronized 也不会等待onDraw执行。。,有这种情况吗???
加载更多回复(4)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧