在onClick函数中,在for循环中多次更改ImageView图像?

时间:2016-11-22 15:34:33

标签: android button onclick imageview onclicklistener

到目前为止,当我在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;
&#13;
&#13;

1 个答案:

答案 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,并在完成后进行清理。

以类似的方式,您可以将闪光灯闪烁加入代码中。