android drawText/drawLines不显示的原因


1.重写View的onDraw不被执行的情况:

如果重写了View的onDraw方法没有被执行。执行方法

setWillNotDraw(false);

2.重写View的onDraw方法执行了(其中的log信息为证),draw方法不好用的可能:代码如下

@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方法没有执行,要么就是坐标位置没有指定对。

你可能感兴趣的:(c,android,null,float)