到目前为止,当我在onClick函数中更改图像时,图像不会改变,直到onClick函数结束。有没有办法在onClick函数期间多次更改图像?我想要做的是,在on Click(即LetterS等)中的每个函数调用都有图像更改。 见下面的代码......
MainActivity:
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isflash) {
LetterS();
LetterO();
LetterS();
imageButton.setImageResource(R.drawable.sos_btn);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Message...");
builder.setMessage("Flashlight is NOT Available on this device...");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}
});
}
public void LetterS() {
imageButton.setImageResource(R.drawable.ltr_s);
for (int l = 1; l <= 3; l += 1) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
// We make the thread sleeping
android.os.SystemClock.sleep(300);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
// We make the thread sleeping
android.os.SystemClock.sleep(200);
}
android.os.SystemClock.sleep(300);
}
public void LetterO() {
imageButton.setImageResource(R.drawable.ltr_o);
for (int l = 1; l <= 3; l += 1) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
// We make the thread sleeping
android.os.SystemClock.sleep(1000);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
// We make the thread sleeping
android.os.SystemClock.sleep(200);
}
android.os.SystemClock.sleep(500);
}
&#13;
答案 0 :(得分:1)
您不应在主线程(也称为UI线程)中使用SystemClock#sleep(long)
。这是处理与用户的所有交互的完全相同的线程。如果您阻止此帖子,则您的用户无法对您的应用执行任何操作。
相反,您可以使用View#post(Runnable)
,View#postDelayed(Runnable, long)
,Handler#post(Runnable)
或Handler#postDelayed(Runnable, long)
等方法安排稍后执行的任务。
让我演示一下这个问题的一个简单子集的使用方法:你有一个ImageButton,你想在用户点击一个按钮后依次显示一组图像(所以我们忽略了手电筒的简单性)。
假设我们希望图像每300毫秒更改一次:
private static final long IMAGE_UPDATE_DELAY_MILLIS = 300;
我们有以下一组可绘制资源:
private static final int[] ALL_DRAWABLE_RES = new int[] {
R.drawable.ltr_s,
R.drawable.ltr_o,
R.drawable.ltr_s
};
最后,我们需要使用其他几个字段:
private int currentDrawableResIndex;
private ImageButton imageButton;
private Runnable updateImageTask;
在我们的onCreate
中,我们将初始化字段:
updateImageTask = new UpdateImageTask();
imageButton = (ImageButton) findViewById(R.id.image_button);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentDrawableResIndex = 0;
imageButton.setImageResource(ALL_DRAWABLE_RES[0]);
imageButton.removeCallbacks(updateImageTask);
imageButton.postDelayed(updateImageTask, IMAGE_UPDATE_DELAY_MILLIS);
}
}
我们马上要实施UpdateImageTask
- 这将是Runnable
做这项工作。在onClick
我们只是取消任何正在进行的任务并开始整个过程。我们的Runnable
发布在UI线程的“消息队列”中,稍后将执行。
在我们的onStop
中,我们也将取消该过程 - 用户不再看到该活动。
imageButton.setImageResource(R.drawable.my_default_drawable);
imageButton.removeCallbacks(updateImageTask);
最后这是我们的Runnable
:
private class UpdateImageTask implements Runnable {
@Override
public void run() {
currentDrawableResIndex++;
if (currentDrawableResIndex < ALL_DRAWABLE_RES.length) {
imageButton.setImageResource(ALL_DRAWABLE_RES[currentDrawableResIndex]);
imageButton.postDelayed(this, IMAGE_UPDATE_DELAY_MILLIS);
} else {
imageButton.setImageResource(R.drawable.my_default_drawable);
}
}
}
因此,如果有更多图像要显示,我们只需重新发布Runnable
,并在完成后进行清理。
以类似的方式,您可以将闪光灯闪烁加入代码中。