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);
} 看看
展开
 我来答
pieryon
推荐于2016-07-19 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14410 获赞数:166869
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部
onDraw是在View初化完成之后开始调用。所以就一次。
程序初始化时,会调用ShowWindow以及UpdateWindow,
而UpdateWindow会发送一个WM_PAINT消息给系统。

因此,你加在OnDraw中的断点会在初始化时生效。

由于,AppWizard生成的程序框架中包含许多涉及发送WM_PAINT消息的函数,比如,当你调整窗口大小,使得客户区中的显示内容改变时,窗口的OnSize函数会发送WM_PAINT消息,此时OnDraw会被调用。

所以,在客户区的显示内容改变,客户区的大小改变,客户区由隐藏到显示,以及诸如此类使客户区内容改变的操作,都会发送WM_PAINT消息,从而调用OnDraw。
大学作业题库
2015-09-05 · 知道合伙人互联网行家
大学作业题库
知道合伙人互联网行家
采纳数:149 获赞数:180
农民出身,单身一位。书写代码过10万行,没读过书。现任利得财富资深酱油人。

向TA提问 私信TA
展开全部
正常情况下都是指调用一次,你代码中调用 invalidate 后,onDraw() 就会被再次调用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LordSimon
2011-08-15 · TA获得超过359个赞
知道小有建树答主
回答量:193
采纳率:0%
帮助的人:213万
展开全部
在事件处理里面需要调用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();
......
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式