![](/img/trans.png)
[英]Is it safe to keep calling View.invalidate so that onDraw is called constantly?
[英]Custom View class' onDraw isn't called by Invalidate
屏幕是白色的,並且從未調用過 onDraw 中的 System.out.println()。
這是我的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);
}
}
invalidate()
不會導致直接調用onDraw()
。 它只是告訴系統需要在下一個繪圖框上重新繪制視圖。 否則在下一個繪圖框系統可以使用之前繪制的內容,因為沒有任何變化。 換句話說,您的invalidate()
調用和最終的onDraw()
調用是異步的。
此外,在構造函數中放置無限while
循環將導致 UI 線程永遠不會執行超過該點的代碼,因此系統甚至永遠不會完成單個布局傳遞,您的視圖甚至永遠不會被繪制一次。 不用說,不要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.