2010-11-25 21 views
0

LineRefresh.java:Warum wird die Zeile nicht aktualisiert?

package LineRefresh.xyz.com; 
import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 

public class LineRefresh extends Activity { 
DrawView drawView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    drawView = new DrawView(this); 
    drawView.setBackgroundColor(Color.WHITE); 
    setContentView(drawView); 

} 
} 

DrawView.java:

package LineRefresh.xyz.com; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Handler; 
import android.view.View; 

public class DrawView extends View { 
Paint paint = new Paint(); 

public DrawView(Context context) { 
    super(context); 

} 

@Override 
public void onDraw(final Canvas canvas) { 
paint.setColor(Color.BLACK); 
canvas.drawLine(50, 200, 270, 200, paint); 
    final Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
    public void run() {  
     paint.setColor(Color.BLACK); 
     canvas.drawLine(50, 200, 270, 200, paint); 
     handler.postDelayed(this, 1000); 
    } 
    };     
} 

} 
+1

offtopic: Pakete werden in der Regel wie com.company.product.application.class genannt, nicht in revert prder. –

Antwort

0

Sie müssen für die OnDraw-Methode invalidate(); innerhalb Ihrer Ansicht aufrufen, um wieder aufgerufen werden. Die OnDraw sollte wie folgt aussehen:

public void onDraw(final Canvas canvas) { 
paint.setColor(color); 
canvas.drawLine(50, 200, 270, 200, paint);     
} 

Auch dürfen sie nicht durch die Schaffung des Handlers und runnable in der OnDraw-Methode. Die onDraw-Methode wird mehrmals aufgerufen, wann immer sie benötigt wird und Sie nicht so viele Runnables erstellen möchten.

In Ihrem Konstruktor:

color = Color.Black;  
final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
public void run() { 
    // change color 
    color = color == Color.Red ? Color.Black : Color.Red;  
    invalidate(); 
    handler.postDelayed(this, 1000); 
} 
}; 
handler.postDelayed(runnable, 1000); // You need this to call the handler for the first time 
+0

Ich habe das versucht ... aber die Zeile blinkt nicht ... wie in, es wird nicht auf dem Bildschirm aktualisiert – hehas

+0

Siehe meinen bearbeiteten Code. Die Linie sollte die Farben jede Sekunde ändern. Versuchen Sie außerdem, den Code zu debuggen, um zu sehen, was passiert. Die Methode onDraw sollte bei jedem Aufruf von invalidate einmal pro Sekunde aufgerufen werden. – kgiannakakis

Verwandte Themen