2016-05-05 13 views
0

Ich werde versuchen, mein Problem so klar wie möglich zu beschreiben. Ich habe eine ImageView auf einem fragment und 3 images (mit a, b, c) in drawable Ordner; Ich habe HashMap verwendet, um jedes Bild mit ihren Buchstaben in Beziehung zu setzen. Es gibt einen String-Wert mit "bac". Ich konvertierte diese Zeichenfolge in Zeichenarray-Buchstabe [], um Zugriff auf jeden einzelnen Buchstaben zu erhalten. Wenn die Funktion aufgerufen wird, sollte sie zuerst b.jpeg in ImageView einfügen, nach 10 Millisekunden Verzögerung sollte ImageView auf a.jpeg aktualisiert werden, danach c.jpeg. Jetzt Problem ist, wo es nur das letzte Bild, das ist c.jpeg in ImageView ist, aber ich will b.jpeg zuerst anzeigen, dann nach der Verzögerung ImageView sollte mit a.jpeg dannjeweils aktualisiert werden? Wie kann ich dies in Funktion unten erreichen?So zeigen Sie ein bestimmtes Bild aus einem Zeichensatz basierend auf bestimmten Zeichen eines Strings an

public void viewSign(){ 
    String value = "bac"; 

    final Map<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("a", R.drawable.a); 
    map.put("b", R.drawable.b); 
    map.put("c", R.drawable.c); 

    value = value.toLowerCase(); //stores "cricket!" 
    char letter[] = value.toCharArray(); 

    for(int z=0;z<value.length();z++){ 

    switch (letter[z]) { 
     case 'a': 
      imageView5.setImageResource(map.get("a")); 
      break; 
     case 'b': 
      imageView5.setImageResource(map.get("b")); 
      break; 
     case 'c': 
      imageView5.setImageResource(map.get("c")); 
      break; 

     default: 
    } 
    try { 
      TimeUnit.MILLISECONDS.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

10ms ist wirklich kurz. Sind Sie sicher, dass Ihr Programm nur c.jpg zeigt? hast du versucht, 10 auf eine höhere Dauer zu ändern, wie 1000 und ob b und a.jpg immer noch nicht angezeigt werden? –

+0

Ja, wenn ich auf 1000 erhöhe. Funktioniert immer noch nicht. Es ist nur für ca. 6 Sekunden stecken und dann c.jpeg anzeigen.Ich denke Runnable Threads können in dieser Situation helfen, aber wie implementiere ich die Logik? – Kira

+0

@Kira können Sie einige Logcat schreiben, wenn das Bild ändern. Dann sagen Sie uns, ob die Logcat korrekt funktioniert oder nicht –

Antwort

0

Bezüglich setImageResource(int) von http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

Dies macht Bitmap Lesen und Decodieren auf dem UI-Thread, der eine Latenz Schluckauf verursachen kann. Wenn dies ein Problem ist, sollten Sie stattdessen setImageDrawable (android.graphics.drawable.Drawable) oder setImageBitmap (android.graphics.Bitmap) und BitmapFactory verwenden.

Versuchen Sie, Ihre Switch-Anweisungen zu diesem Wechsel:

imageView5.setImageDrawable(getResources().getDrawable(map.get("a"));

+0

Funktioniert immer noch nicht, wenn ich Jonathan-Lösung versuche, indem ich Anweisungen umschalte, aber im Protokoll sagt es "die Anwendung kann zu viel Arbeit an ihrem Hauptthread machen" – Kira

+0

Wie wäre es mit 'CountDownTimer ': http://developer.android.com/reference/android/os/CountDownTimer.html –

+0

Scheint wie eine gute Idee; Wie implementiere ich das in Funktion, um meiner eigenen Logik zu entsprechen? – Kira

0

Was passiert, ist, dass Ihr Code wirklich UI-Rendering stoppt, während viewSign() -Methode ausgeführt wird. Jedes Mal, wenn Sie sleep() aufrufen, wird der UI-Thread angehalten. So wird am Ende nur der letzte Drawable gezeigt.

Wenn Sie möchten, dass sie nacheinander erscheinen, würde ich vorschlagen, die Methode postDelayed in Ihrer Bildansicht zu verwenden.

Etwas entlang der Linien:

imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 1000); 
imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 2000); 
imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 3000); 
0
char[] letter; 
Map<String, Integer> map 
public void viewSign(){ 
     String value = "bac"; 

     map = new HashMap<String, Integer>(); 
     map.put("a", R.drawable.a); 
     map.put("b", R.drawable.b); 
     map.put("c", R.drawable.c); 

     value = value.toLowerCase(); //stores "cricket!" 
     letter = value.toCharArray(); 

     final Handler handler = new Handler(); 
      Timer timer = new Timer(); 
      TimerTask doAsynchronousTask = new TimerTask() { 
       @Override 
       public void run() { 
        handler.post(new Runnable() { 
         public void run() { 
          try { 
           UpdateUI(); 
          } catch (Exception e) { 
           // TODO Auto-generated catch block 
          } 
         } 
        }); 
       } 
      }; 
      timer.schedule(doAsynchronousTask, 0, 10); 

    } 

Ihr UI-Update,

int arrayPosition = 0; 
private void UpdateUI() {  
    if(letter.length>0){ 
     imageView5.setImageResource(map.get(String.valueOf(letter[arrayPosition]))); 
     arrayPosition++; 
     if(letter.length == arrayPosition){ 
      arrayPosition = 0;//By reset the position, it will repeat the same process 
     } 
    }   
} 

In dem obigen Code, ich versuche einfach, mit Ihrem Code zu passen, aber Sie müssen machen Der Code ist effizient und fehlerfrei.

Versuchen Sie dies und lassen Sie mich wissen, ich überprüft von meiner Seite funktioniert es gut.

+0

Letter [] = value.toCharArray(); gab Fehler, musste Klammern entfernen, aber es funktioniert nicht, keine Bilder eingefügt in Bildansicht – Kira

+0

Einfach das Array global dann nur Sie können es von UpdateUI-Methode zugreifen. (Ich fügte hinzu, um durch eigene implementieren) – Srinivasan

+0

Ich machte es global aber in UpdateUI, ich denke, Bild wurde nicht in der Bildansicht festgelegt. – Kira

0

Hey Kira, wenn Ihre Anwendung diese Zeile TimeUnit.MILLISECONDS.sleep(10); erreicht Ihr Haupt-Thread in den Schlafzustand daher die Latenz. Auch Ihre Haupt-Thread-Logik wird nie ausgeführt, bis die for-Schleife abgeschlossen ist und das letzte Bild gesetzt ist. erst nachdem Ihre Funktion zurückkehrt, wird das Kontrollbild gezeichnet. Hier ist der Code, der Ihnen helfen wird.

final Map<String, Integer> map = new HashMap<String, Integer>(); 
     map.put("a", R.drawable.a); 
     map.put("b", R.drawable.b); 
     map.put("c", R.drawable.c); 
    value = value.toLowerCase(); //stores "cricket!" 
    char letter[] = value.toCharArray(); 
    Thread thread = new Thread(new Runnable() { 
    @Override 
        public void run() { 


          for(int z=0;z<letter.length;z++){ 

    switch (letter[z]) { 

     case 'a': 
      imageid = map.get("a");//this variable is instance variable of class not local variable 
      break; 
     case 'b': 
      imageid = map.get("b"); 
      break; 
     case 'c': 
      imageid = map.get("c"); 
      break; 

     default: 
    } 
          imageView5.post(new Runnable() { 
           @Override 
           public void run() { 
            imageView5.setImageResource(imageid); 
           } 
          }); 
          try { 
           Thread.sleep(1000); 
          } catch (InterruptedExeption e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 
thread.start(); 
+0

Wats Imageid hier in Code, und ich bekomme Fehler in Ihrem Code – Kira

+0

seine Integer-Variable –

+0

Wenn Sie post-verzögerte App Antwort verwenden wird Laggy sein –

Verwandte Themen