android onDraw() 为什么只调用了一次?
publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setCo...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
public boolean onTouchEvent(MotionEvent event){
int iAction=event.getAction();
switch (iAction) {
case MotionEvent.ACTION_DOWN:
x1=(int)event.getX();
y1=(int)event.getY();
//Toast.makeText(this,"点击坐标:("+Integer.toString(x1)+"/,"+Integer.toString(y1)+")",2000);
Log.d("tlq", "x1="+x1+"y1="+y1);
break;
case MotionEvent.ACTION_UP:
//得到触电的位置
x2=(int)event.getX();
y2=(int)event.getY();
//Toast.makeText(this,"点击坐标:("+Integer.toString(x2)+"/,"+Integer.toString(y2)+")",2000);
Log.d("tlq", "x2="+x2+"y2="+y2);
break;
}
return true;
}
class myView extends View{
public myView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
p_color=Color.BLUE;
c_color=Color.WHITE;
Paint p=new Paint();
p.setColor(p_color);
p.setStrokeWidth(2);
canvas.drawColor(c_color);
canvas.drawLine(getX1(), getY1(), getX2(), getY2(), p);
//canvas.drawRect((float)getX1(), (float)getY1(), (float)getX2(), (float)getY2(), p);
Log.d("tlq", "xx1="+x1+"yy1="+y1);
Log.d("tlq", "xx2="+x1+"yy2="+y1);
super.onDraw(canvas);
} 看看 展开
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
public boolean onTouchEvent(MotionEvent event){
int iAction=event.getAction();
switch (iAction) {
case MotionEvent.ACTION_DOWN:
x1=(int)event.getX();
y1=(int)event.getY();
//Toast.makeText(this,"点击坐标:("+Integer.toString(x1)+"/,"+Integer.toString(y1)+")",2000);
Log.d("tlq", "x1="+x1+"y1="+y1);
break;
case MotionEvent.ACTION_UP:
//得到触电的位置
x2=(int)event.getX();
y2=(int)event.getY();
//Toast.makeText(this,"点击坐标:("+Integer.toString(x2)+"/,"+Integer.toString(y2)+")",2000);
Log.d("tlq", "x2="+x2+"y2="+y2);
break;
}
return true;
}
class myView extends View{
public myView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
p_color=Color.BLUE;
c_color=Color.WHITE;
Paint p=new Paint();
p.setColor(p_color);
p.setStrokeWidth(2);
canvas.drawColor(c_color);
canvas.drawLine(getX1(), getY1(), getX2(), getY2(), p);
//canvas.drawRect((float)getX1(), (float)getY1(), (float)getX2(), (float)getY2(), p);
Log.d("tlq", "xx1="+x1+"yy1="+y1);
Log.d("tlq", "xx2="+x1+"yy2="+y1);
super.onDraw(canvas);
} 看看 展开
3个回答
推荐于2016-07-19 · 知道合伙人数码行家
关注
展开全部
onDraw是在View初化完成之后开始调用。所以就一次。
程序初始化时,会调用ShowWindow以及UpdateWindow,
而UpdateWindow会发送一个WM_PAINT消息给系统。
因此,你加在OnDraw中的断点会在初始化时生效。
由于,AppWizard生成的程序框架中包含许多涉及发送WM_PAINT消息的函数,比如,当你调整窗口大小,使得客户区中的显示内容改变时,窗口的OnSize函数会发送WM_PAINT消息,此时OnDraw会被调用。
所以,在客户区的显示内容改变,客户区的大小改变,客户区由隐藏到显示,以及诸如此类使客户区内容改变的操作,都会发送WM_PAINT消息,从而调用OnDraw。
程序初始化时,会调用ShowWindow以及UpdateWindow,
而UpdateWindow会发送一个WM_PAINT消息给系统。
因此,你加在OnDraw中的断点会在初始化时生效。
由于,AppWizard生成的程序框架中包含许多涉及发送WM_PAINT消息的函数,比如,当你调整窗口大小,使得客户区中的显示内容改变时,窗口的OnSize函数会发送WM_PAINT消息,此时OnDraw会被调用。
所以,在客户区的显示内容改变,客户区的大小改变,客户区由隐藏到显示,以及诸如此类使客户区内容改变的操作,都会发送WM_PAINT消息,从而调用OnDraw。
2015-09-05 · 知道合伙人互联网行家
关注
展开全部
正常情况下都是指调用一次,你代码中调用 invalidate 后,onDraw() 就会被再次调用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在事件处理里面需要调用view 的invalidate方法,通知系统让view重绘。。。。
更多追问追答
追问
能具体吗?在那块调用
追答
onTouchEvent(MotionEvent event){ 里面调用。
当然,你需要一个myView实例的引用才行。
View myView ;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new myView(this);
setContentView(myView);
}
public boolean onTouchEvent(MotionEvent event){
myView.invalidate();//在下面需要的位置调用也可以。
int iAction=event.getAction();
......
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |