簡體   English   中英

Invalidate 不調用自定義視圖類的 onDraw

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM