Ich kann nicht verstehen, warum das erste Mal, wenn ich this.invalidate
in einer benutzerdefinierten Ansicht aufrufen, die Methode onDraw()
zweimal aufgerufen wird (Doppeloperationen auf demselben ausführen Variablen). Danach wird jedes Mal, wenn der Benutzer eine Taste drückt, onDraw()
einmal aufgerufen, wie es sein sollte. Hier ist der Code:'onDraw()' zweimal aufgerufen, wenn 'invalidate' zum ersten Mal aufgerufen wird
MyActivity
MyView mCustomView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_interval_identification);
mCustomView = (MyView) findViewById(R.id.my_view);
Button mButton = (Button) findViewById(R.id.id_btn);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newDrawing();
}
});
newDrawing();
}
private void newDrawing() {
int a;
int b;
//some operations on 'a' and 'b'
mCustomView.newDrawing(a, b);
}
MyView
int x;
int y;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Drawable object = ContextCompat.getDrawable(getContext(), R.drawable.object);
//some operations
object.draw(canvas); //based on 'x' and 'y'
}
public void newDrawing(int a, int b) {
x = a;
y = b;
this.invalidate();
}
Es funktioniert nicht. Das Objekt wird nicht korrekt gezeichnet, da 'a' und 'b' nicht festgelegt wurden. –
Sie könnten überprüfen, ob die Parameter 'a' und' b' bereits in 'onDraw'-Methode gesetzt wurden (zum Beispiel mit' boolean'), also sollte das Objekt nur gezeichnet werden, wenn 'a',' b' sind bekannt. – user35603
Aber auf diese Weise wird das Objekt nicht gezeichnet, bis der Benutzer den Knopf drückt und 'newDrawing()' aufgerufen wird. –