我会尽可能清楚地描述我的问题。我在ImageView
文件夹中fragment
和images
(标记为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();
}
}
}
答案 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();