android中所有屏幕的显示基本都是依靠回调这个函数,
public void onDraw(Canvas canvas){
............
}
在程序启动之后,执行A.invalidate() ,只是invalidate了屏幕的一部分区域。但是在onDraw第二次次回调中,会render overall screen area.
第二次次调用完成之后,A.invalidate() 执行,只会render 屏幕中无效的那一部分,虽然也会调用不再无效区域中的View.onDraw并执行起内部代码。但是并不重画这部分区域。在android中使用Canvas进行绘画,Canvas类内部都是本地JNI代码。
如下代码 可测试:
public class DrawView extends View { Paint mPaint; private Paint mBackgroudPaint; private int backgroundColor=0xff0000ff;// 背景颜色 private int mN=0; public DrawView(Context context) { super(context); // TODO Auto-generated constructor stub mPaint = new Paint(); mPaint.setColor(Color.WHITE); mPaint.setTextSize(24); mBackgroudPaint=new Paint(); mBackgroudPaint.setColor(backgroundColor); } public void onDraw(Canvas canvas){ Log.d("DrawView", "DrawView in liuwei =="+mN); mN++; if(mN>1){ mBackgroudPaint.setColor(0xffff0000); } RectF rect=new RectF(0,0,this.getRight()-this.getLeft(),this.getBottom()-this.getTop()); canvas.drawRoundRect(rect, 40.0f, 40.0f, mBackgroudPaint); for(int i=0;i<mN;i++){//当无效区域不包括此View时,虽然回调onDraw方法,进而执行此代码,但是因为不再无效//去内,所以不起作用,不会被绘画。 canvas.drawText("读取信息!+ "+ i+" SaveCount== "+canvas.getSaveCount(), 0, 40+24*i, mPaint); } }}
这样设计不知google出于什么考虑? 控制源码是哪块?
如果有哪位仁兄知道,请留言,不胜感激!
使Configure 发生变化,也会间接回调onDraw方法(回调几次),而且此时整个屏幕都会被重新绘画。结束后 此时手动某一个View,使其无效,第一次回调onDraw时,也是整个屏幕都会被重新绘画,接下来回调每一个View的onDraw方法,只有无效区域会被重画。。