2016-04-18 18 views
0

Ich möchte einen blinkenden Effekt erstellen, indem Sie einen Pfad mit Farbe grau, weiß (passend zum Hintergrund) und dann wieder grau zeichnen. Ich möchte 3 Mal blinken, 1 Sekunde grau, 1 Sekunde grau, 1 Sekunde wieder grau usw.Timer funktioniert nicht in Android beim Aufruf von invalidate()

Wenn ich ein Handler für postDelayed() erstellt habe, übersprang das Programm den run() und führte es nicht aus in dem Zeitpunkt gesetzt, und kein blinken aufgetreten:

final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       invalidate(); //calls onDraw() 
       Log.d(TAG, "Flashing now now"); 
      } 
     }, 1000); 

Wie würde ich eine solche blinkende Funktionalität mit einem Timer implementieren und 3-mal blinken?

Danke!

+0

warum versuchst du nicht zeiterfassung? –

+0

Wie würde ich das tun? Kannst du mir bitte ein Beispiel geben? – Eddev

Antwort

2

Sie so etwas wie dies versuchen,

int delay = 5000; // delay for 5 sec. 

int period = 1000; // repeat every sec. 

Timer timer = new Timer(); 

timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 

System.out.println("done} 

}, delay, period); 

Ansonsten haben Sie andere Beispiele viel wie dieses Example 1, Example 2, folgen Example 3 etc. Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen.

+0

Danke, JNI_OnLoad! – Eddev

0

Dies ist ein funktionierendes Codebeispiel, wie wir einen Globus von blau nach rot und wieder zurück flashen. Sie können den Code auf der Innenseite ändern, um zu begrenzen, wie oft und wie viel Zeit Sie möchten.

protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this); 

@Override 
protected onCreate(Bundle bundle) { 
     handlerFlashGlobe.sendEmptyMessageDelayed(0, 700); 
} 

/** 
* private static handler so there are no leaked activities. 
*/ 
protected static class MyGlobeFlasherHandler extends Handler { 


     private final WeakReference<HomeBase> activity; 

     public MyGlobeFlasherHandler(HomeBase activity) { 
      this.activity = new WeakReference<HomeBase>(activity); 
     } 

    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 

     if (activity.get() != null) { 
      if (activity.get().shadedGlobe) { 
       activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue)); 
      } else { 
       activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red)); 
      } 

      activity.get().shadedGlobe = !activity.get().shadedGlobe; 

      sendEmptyMessageDelayed(0, 700); 
     } 
    } 

} 
+0

Hallo Kristy, hier animierst du mit zwei verschiedenen Bildern. Das ist keine sehr gute Programmierpraxis; Idealerweise sollten Sie eine PNG-Datei festlegen und die Farbe programmgesteuert ändern, indem Sie möglicherweise 'setIndent()' verwenden. – Eddev

+0

@Eddev Können Sie mir sagen, was Sie mit "schlechter Programmierung" meinen? Außerdem ist das Bild ein Foto und ich kann mir nicht vorstellen, die Farbe prgrammatisch zu ändern. –