2016-05-14 45 views
0

屏幕为白色& onDraw中的System.out.println()从未调用过。自定义视图类'onDraw不会被Invalidate调用

这是我activity_main.xml中

<foo.packagename.MyView 
    android:id="@+id/myView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

自定义视图类:

public class MyView extends View { 

public MyView(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 

    System.out.println("This line is called"); 

    while (true) { 
     invalidate(); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.GREEN); 
    System.out.println("This line is never printed"); 
} 

主要活动:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     System.out.println("This line is called"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     View myView = findViewById(R.id.myView); 
    } 
} 
+0

摆脱构造函数中的while循环。 –

+0

修复它。尽管 – eikai

+0

我仍然不明白,但是直到现在我才注意到,在我回复时你一定已经改变了你的评论。是的,下面的答案解释了它。 –

回答

0

invalidate()不会导致onDraw()直接调用。它只是告诉系统该视图需要在下一个绘制框架上重绘。否则,在下一个绘图框架中,系统可以使用之前绘制的内容,因为没有任何变化。换句话说,您的invalidate()呼叫和最终的onDraw()呼叫是异步的。

此外,在构造函数中放入一个无限循环while将导致UI线程永远不会执行超出该点的代码,所以系统甚至不会完成一个布局传递,并且您的视图永远不会被绘制一次。不用说,不要这样做

相关问题