1.重写View的onDraw不被执行的情况:
如果重写了View的onDraw方法没有被执行。执行方法
setWillNotDraw(false);
@Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub Log.d(TAG, "ShootingAnimationView ---- onDraw()"); super.onDraw(canvas); if(showFrame){ if(mPaint == null){ mPaint = new Paint(); } float []points = { getLeft()+10,getTop()+10, /*A*/ getRight(),getTop()+10, /*B*/ getLeft()+10,getBottom()-10, /*C*/ getRight()-10,getBottom()-10, /*D*/ getLeft()+10,getTop()+10, /*A*/ getLeft()+10,getBottom()-10, /*C*/ getRight()-10,getTop()+10, /*B*/ getRight()-10,getBottom()-10, /*D*/ }; canvas.drawLines(points, 0, 16, mPaint); Log.d(TAG, "drawLines"); canvas.drawText("I am Bill.", getLeft(), getTop(), mPaint); } }
首先:
如果这个是充满父控件显示的,这个时候,线可以画出来,距离边框10像素,画一个矩形。
但是文字不能画出来。这里的原因是:drawText方法的x、y是文字左下角的坐标。所以文字出屏幕了。改成,
canvas.drawText("I am Bill.", getLeft(), getTop()+30, mPaint);可以看到文字了。
其次:
如果View的布局属性不是充满父控件,这样就真的出问题了。
例如父控件的布局是充满父控件的,而被重写的这个View的宽搞都为200像素,
这样会发现,线和文字都没有画上去。原因是
getLeft(),方法获得的是View相对父空间的像素点位置,也就是View的左边框距离父控件的左边框的距离。假设是500像素。
这个时候在drawLines方法总用500的意思是在距离View左边框500像素的位置画点。而View总共的宽度才200像素。
超出了。所有看不到画的线。
在drawText和drawLines方法中,View的左边框像素就是0,top也是0.跟父控件没关系,即跟
getLeft()等系列方法没有关系。
总之,drawText/drawLines不显示的原因,要么是onDraw方法没有执行,要么就是坐标位置没有指定对。