为什么在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); ... }