2016-05-05 26 views
0

できるだけ明確に問題を記述しようとします。 drawableフォルダにfragmentimages(a、b、cというラベルが付けられています)にImageViewがあります。私はHashMapを使ってそれぞれの画像をそれぞれの文字と関連づけました。 "bac"という文字列値があります。私はこの文字列を文字配列文字[]に変換して、それぞれの文字にアクセスしました。関数が呼び出されると、それはImageViewへの最初のb.jpegを挿入する必要があり、10ミリ秒の遅延後、ImageViewは、その後c.jpega.jpegに更新する必要があります。今問題はc.jpegの最後の画像を挿入してImageViewに入れますが、最初にb.jpegを表示してから、遅れてImageViewa.jpegc.jpegにそれぞれ更新する必要がありますか?どのように私は以下の機能でこれを達成できますか?文字列の特定の文字に基づいてdrawableから特定のイメージを表示する方法

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のは本当に短いです。あなたのプログラムはc.jpgしか表示していませんか? 1000と同じように、10をより高い持続時間に変更しようとしましたが、bとa.jpgがまだ表示されていないかどうかを確認してください。 –

+0

私は1000に増加するとはい。それでも動作しません。ちょうど約6秒間止まってからc.jpegを表示します。私はRunnableスレッドはこの状況で助けることができると思うが、私はどのようにロジックを実装するのですか? – Kira

+0

@Kira画像を変更すると、いくつかのlogcatを書くことができます。 logcat作業が正しいかどうか教えてください –

答えて

0

setImageResource(int)についてhttp://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

からこれは、待ち時間しゃっくりを引き起こす可能性がUIスレッド、上のビットマップの読み込みとデコードを行います。これが問題であれば、setImageDrawable(android.graphics.drawable.Drawable)またはsetImageBitmap(android.graphics.Bitmap)とBitmapFactoryを代わりに使用することを検討してください。

これにあなたのswitch文を変更してみてください:

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

+0

ステートメントを切り替えることでJonathanのソリューションを試しても動作しないが、ログに「アプリケーションがメインスレッドで処理しすぎている可能性があります」というメッセージが表示される – Kira

+0

「CountDownTimer ':http://developer.android.com/reference/android/os/CountDownTimer.html –

+0

良いアイデアのようです。私は自分のロジックに合わせるためにこれをどのように実装しますか? – Kira

0

何が起こっているviewSign()メソッドが実行されている間、あなたのコードは本当にUIのレンダリングを停止することです。 sleep()を呼び出すたびにUIスレッドが一時停止します。最終的に最後の描画可能なものが表示されています。

画像が表示されないようにするには、画像ビューでpostDelayedメソッドを使用することをおすすめします。

線に沿って何か:

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); 

    } 

彼女のあなたのUIの更新、上記のコードで

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 
     } 
    }   
} 

は、私はあなたのコードに合わせてみてください、しかし、あなたは確認する必要があり効率的でエラーのないコードです。

これを試してみてください。アプリケーションは、あなたのメインスレッドは、したがって、スリープ状態への待ち時間を取得しTimeUnit.MILLISECONDS.sleep(10);次の行を打つ

+0

Letter [] = value.toCharArray();エラーが発生しましたが、かっこを取り除く必要がありましたが、画像が画像ビューに挿入されていません。 – Kira

+0

配列全体をグローバルにして、UpdateUIメソッドからのみアクセスできます(独自に実装しました) – Srinivasan

+0

グローバルにしました。 UpdateUIでは、イメージがイメージビューで設定されていないと思います。 – Kira

0

ねえキラ。 また、forループが完了して最後のイメージが設定されるまで、メインスレッドのロジックは決して実行されません。 関数が返すと、制御イメージが描画されます。 ここにあなたを助けるコードがあります。

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コード内にあり、あなたのコードにエラーがあります – Kira

+0

整数変数 –

+0

遅れているアプリの応答が遅れている場合は遅くなります –

関連する問題