Ich möchte die Farbe eines gezeichneten Rechtecks jede Sekunde ändern. Ich habe den folgenden Code, um dies zu tun.Benutzerdefinierte Ansicht Ignorieren Verzögerung
private Runnable mRunnable;
private int mIndex;
...
public BlinkingView(Context context) {
this(context, null);
mRunnable = new Runnable() {
@Override
public void run() {
long currentMillis = System.currentTimeMillis();
Log.d("Tag", "Millis Dif -- " + (mIndex== 0 ? "GREEN" : "RED") + " :: " + (currentMillis - lastMillis));
lastMillis = currentMillis;
// Set the paint color to be drawn.
mColoredRectPaint.setColor(mIndex++ % 2 == 1 ? Color.RED : Color.GREEN);
// Update the view.
invalidate();
// Run again.
postDelayed(mRunnable, 1000);
}
};
post(mRunnable);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Draw the colored rectangle
canvas.drawRect(mLeft, mTop, mRight, mBottom, mColoredRectPaint);
// Draw a boarder rectangle.
canvas.drawRect(mStrokeLeft, mStrokeTop, mStrokeRight, mStrokeBottom, mOuterRectPaint);
}
Aber nur jeder zweite Anruf postDelayed
verzögert. Ich melde mich die Anzahl der Millisekunden zwischen jedem Aufruf der Run-Methode des Runnable ab.
D/Tag: DURATION -- GREEN :: 1000
D/Tag: DURATION -- RED :: 1
D/Tag: DURATION -- GREEN :: 1002
D/Tag: DURATION -- RED :: 3
D/Tag: DURATION -- GREEN :: 1001
D/Tag: DURATION -- RED :: 3
D/Tag: DURATION -- GREEN :: 1001
D/Tag: DURATION -- RED :: 2
So wird jeder andere Anruf verzögert. Irgendwelche Ideen warum?
Die Verzögerung wird in der Regel eine Fehlerquote haben, wenn ich mich richtig erinnere – JoxTraex
ich dachte, es garantiert sie nach dieser Zeit aber nicht unbedingt sein würde genau diese Zeit. Auch eine volle Sekunde ist eine ziemlich große Fehlerspanne. –
Eine Sache, die Sie klären sollten, ist Ihr Protokoll, auf das Sie sich beziehen. Und zeigen Sie den Code genau so, wie Sie ihn geschrieben haben. – JoxTraex