2017-12-05 1 views
0

Ich versuche, eine einfache Android-App, die einige Bilder für eine benutzerdefinierbare Anzahl von Millisekunden zeigen wird. Der folgende Code springt nach 11 Sekunden zum letzten Bild. können Sie einen Blick und sagen Sie mir, was Sie denken.Android Skipping Diashow Frames

public void buttonPressed(View view){ 
     ImageView canvas = findViewById(R.id.canvas); 
      delay(1000); 
      canvas.setImageResource(R.drawable.c1); 
     delay(1000); 
      canvas.setImageResource(R.drawable.c2); 
     delay(1000); 
      canvas.setImageResource(R.drawable.c3); 
     delay(1000); 
      canvas.setImageResource(R.drawable.c4); 
     delay(1000); 
      canvas.setImageResource(R.drawable.c5); 
     delay(5000); 
      canvas.setImageResource(R.drawable.c6); 
     delay(2000); 
} 
    void delay(long ms){ 
     long init = SystemClock.uptimeMillis(); 
     while(SystemClock.uptimeMillis() != init+ms); 
    } 

Ich bin offen für C/C++ - Alternativen. Ich wünschte, es gäbe eine "Call Kernel" -Funktion für das Display. In Zukunft möchte ich, dass der Benutzer die Bilder auswählen oder aufnehmen kann.

ich einen anderen Ansatz bin mit:

public class MainActivity extends AppCompatActivity { 
     private ImageView canvas; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      canvas = findViewById(R.id.canvas); 
     } 


     public void buttonPressed(View view){ 

      new STask().execute("start"); 

     } 
     public class STask extends AsyncTask<String,Void,Void>{ 

      @Override 
      protected Void doInBackground(String... strings) { 
       long start = SystemClock.uptimeMillis(); 
       if(SystemClock.uptimeMillis() == start + 1000){ 
        canvas.setImageResource(R.drawable.c2); 
        canvas.invalidate(); 
       }else if(SystemClock.uptimeMillis() == start + 3000){ 
        canvas.setImageResource(R.drawable.c3); 
        canvas.invalidate(); 
       }else if(SystemClock.uptimeMillis() == start + 4500){ 
        canvas.setImageResource(R.drawable.c4); 
        canvas.invalidate(); 
       }else if(SystemClock.uptimeMillis() == start + 8000){ 
        canvas.setImageResource(R.drawable.c5); 
        canvas.invalidate(); 
       }else if(SystemClock.uptimeMillis() == start + 10000){ 
        canvas.setImageResource(R.drawable.c6); 
        canvas.invalidate(); 

       } 
       return null; 
      } 


     } 

    } 

Ich brauche die AsyncTask ständig im Hintergrund laufen zu lassen.

+0

Überspringt es Frames oder sind einige Frames zu lang? – mewa

+0

Es werden Frames übersprungen –

+0

Hilft es, wenn Sie '! =' Für '<'? – mewa

Antwort

1

Ich löste es, indem ich die Verzögerungen auf einen separaten Thread setzte und eine Runnable machte, um die Folie zu ändern und diese auf dem UI-Thread auszuführen.