2016-09-11 19 views
0

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(); 
} 

Antwort

0

Versuchen Kommentar newDrawing(); (newDrawing(); --> //newDrawing();) in Ihrem onCreate Methode in MyActivity. Es scheint erstmalig onDraw wird vom System automatisch aufgerufen.

+0

Es funktioniert nicht. Das Objekt wird nicht korrekt gezeichnet, da 'a' und 'b' nicht festgelegt wurden. –

+0

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

+0

Aber auf diese Weise wird das Objekt nicht gezeichnet, bis der Benutzer den Knopf drückt und 'newDrawing()' aufgerufen wird. –

Verwandte Themen