지금까지 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);
}
SystemClock#sleep(long)
메인 스레드 (UI 스레드라고도 함)에서 사용해서는 안됩니다 . 이것은 사용자와의 모든 상호 작용을 처리하는 동일한 스레드입니다. 이 스레드를 차단하면 사용자는 앱에서 어떤 작업도 수행 할 수 없습니다.
대신 같은 방법을 사용할 수 있습니다 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
표시 할 이미지가 더 있으면 간단히 다시 게시하고 완료 한 후에 정리합니다.
비슷한 방법으로 코드에 손전등 깜박임을 포함 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다