为什么在invalidate()之后不调用onDraw?

我已经find了很多post在stackoverflow,但我仍然无法解决我的问题。 这是我的代码片:

public class MyView extends RelativeLayout { Button b1; Button b2; Context sContext; public static int i = 0; private int w = 400; private int h = 400; private int w2 = 100; private int h2 = 100; public MyView(Context context) { super(context); sContext = context; init(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); sContext = context; init(); } private void init() { b1 = new Button(sContext); addView(b1); b1.setBackgroundColor(Color.YELLOW); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (w >= 600) { MyView.this.setBackgroundColor(Color.GREEN); //b1.setBackgroundColor(Color.RED); } else { MyView.this.setX(100); } MyView.this.invalidate(); w += 100; w2 += 20; } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //b1.setBackgroundColor(Color.RED); Toast.makeText(sContext, ""+i, Toast.LENGTH_SHORT).show(); ++i; } } 

请您解释为什么onDraw不是前三次按b1? 因为我每次按b1都会失效。 非常感谢你!

默认情况下,所有ViewGroup子类都不会调用他们的onDraw方法,您应该通过调用setWillNotDraw(false) 链接来启用它

借用链接@

Android自定义布局 – onDraw()永远不会被调用

尝试下面的作品

1.如果你扩展一个ViewGroup(在你的情况下是一个RelativeLayout ),你应该重写dispatchDraw()而不是onDraw()

讨论话题@

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/oLccWfszuUo

protected void dispatchDraw (Canvas canvas)

通过绘制来绘制子视图。 派生类可能会覆盖这个类,以便在其子项被抽取之前获得控制(但是在它自己的视图被绘制之后)

参数

canvas上绘制视图的canvas

 public class Hello extends Activity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); Log.e("hello", "hello"); this.myView = new MyView(this); setContentView(this.myView); } public class MyView extends RelativeLayout { private Paint myPaint = new Paint(); private int[] numbers; public MyView(Context paramContext) { super(paramContext); Log.e("MyView", "MyView"); setFocusable(true); setBackgroundResource(R.drawable.ic_launcher); } @Override protected void dispatchDraw(Canvas canvas){ super.dispatchDraw(canvas); Log.i("...............","drawing"); } } } 

2.如果你在构造函数中重写onDraw setWillNotDraw(false)那么它应该工作。

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean);

 public MyView(Context context) { super(context); sContext = context; init(); setWillNotDraw(false); } 

你需要调用setWillNotDraw(false); 为了让你的onDraw方法被调用:

 private void init() { setWillNotDraw(false); ... }