2016-05-14 85 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線程永遠不會執行超出該點的代碼,所以系統甚至不會完成一個佈局傳遞,並且您的視圖永遠不會被繪製一次。不用說,不要這樣做

相關問題