如何根据String的特定字符显示drawable中的特定图像

时间:2016-05-05 04:13:09

标签: android

我会尽可能清楚地描述我的问题。我在ImageView文件夹中fragmentimages(标记为a,b,c)有drawable;我使用HashMap分别将每个图像与其字母相关联。 String值为“bac”。我将此字符串转换为字符数组字母[]以访问每个单独的字母。调用函数时,应先将b.jpeg插入ImageView,延迟10毫秒后,ImageView应更新为a.jpeg,然后再更新c.jpeg。现在的问题是它只插入c.jpeg ImageView中的最后一张图片,但我希望b.jpeg首先显示,然后延迟ImageView之后应更新a.jpeg那么分别是c.jpeg?我如何在下面的功能中完成这个?

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

}

4 个答案:

答案 0 :(得分:0)

关于来自http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

setImageResource(int)
  

这会在UI线程上进行Bitmap读取和解码,这会导致延迟打嗝。如果这是一个问题,请考虑使用setImageDrawable(android.graphics.drawable.Drawable)或setImageBitmap(android.graphics.Bitmap)和BitmapFactory。

尝试将您的switch语句更改为:

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

答案 1 :(得分:0)

正在执行的是,在执行viewSign()方法时,您的代码确实会停止UI呈现。每次调用sleep()时,它都会暂停UI线程。所以最后只显示了最后一个drawable。

如果您希望它们连续显示,我建议您在图片视图中使用postDelayed方法。

有些事情:

imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 1000);
imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 2000);
imageView5.postDelayed(new Runnable(){ imageView.setDrawable(..);}, 3000);

答案 2 :(得分: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
         }
    }        
}

在上面的代码中,我只是尝试与您的代码匹配,但您需要使代码高效且无错误。

试试这个让我知道,我从我这边检查了它的工作正常。

答案 3 :(得分:0)

当你的应用程序遇到此行TimeUnit.MILLISECONDS.sleep(10);时,你的主线程进入睡眠状态因此延迟时,嘿kira。 此外,您的主线程逻辑永远不会执行,直到完成循环并设置最后一个图像。 只有在函数返回后才会绘制控件图像。 以下是可以帮助您的代码。

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