到目前为止,当我在 onClick 函数中更改图像时,图像不会更改,直到 onClick 函数结束。有没有办法在 onClick 函数期间多次更改图像?我想做的是,在单击时(即 LetterS 等)中的每个函数调用都更改图像。 请参阅下面的代码...
主要 Activity :
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);
}
最佳答案
您不应在主线程(也称为 UI 线程)中使用 SystemClock#sleep(long)
。这是处理与用户的所有交互的同一个线程。如果您阻止此线程,您的用户将无法使用您的应用执行任何操作。
相反,您可以使用 View#post(Runnable)
、View#postDelayed(Runnable, long)
、Handler#post(Runnable)
等方法code> 或 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
中,我们还将取消该过程 - Activity 不再对用户可见。
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
,并在完成后进行清理。
以类似的方式,您可以将手电筒闪烁包含到您的代码中。
关于android - 在 onClick 函数期间的 for 循环中多次更改 ImageView 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40745877/