1

画面は白く、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);
    }
}
4

1 に答える 1

2

invalidate()onDraw()直接呼び出されることはありません。次の描画フレームでビューを再描画する必要があることをシステムに伝えるだけです。それ以外の場合、次の描画フレームでは、何も変更されていないため、システムは以前に描画されたものを使用できます。つまり、invalidate()呼び出しと最終的なonDraw()呼び出しは非同期です。

また、コンストラクターに無限whileループを配置すると、UI スレッドがその時点を超えてコードを実行しないため、システムは 1 つのレイアウト パスを完了することさえできず、ビューは一度も描画されません。言うまでもなく、これをしないでください。

于 2016-05-14T17:24:02.477 に答える