Пользовательский класс представления ' onDraw не вызывается Invalidate
Экран белый, а System.out.println() в onDraw никогда не вызывается.
Это мой 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);
}
}
1 ответ
invalidate()
не вызывает onDraw()
быть вызванным напрямую. Это просто говорит системе, что вид должен быть перерисован в следующем фрейме рисования. В противном случае в следующем кадре рисования система может использовать то, что было нарисовано ранее, поскольку ничего не изменилось. Другими словами, ваш invalidate()
вызов и возможный onDraw()
вызов асинхронный.
Кроме того, положить бесконечное while
Цикл в вашем конструкторе приведет к тому, что поток пользовательского интерфейса никогда не выполнит код, выходящий за пределы этой точки, поэтому система никогда не выполнит даже один проход макета, и ваше представление никогда не будет отображено ни разу. Само собой разумеется, не делайте этого.