android - 在 onClick 函数期间的 for 循环中多次更改 ImageView 图像?

标签 android button onclick imageview onclicklistener

到目前为止,当我在 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/

相关文章:

android - 如何使用 jQuery-mobile 开发看起来原生于 Android 的 UI?

javascript - 尝试创建一个Java脚本函数,当按下按钮时会出现图像

android - 可绘制文件夹 - 我需要什么分辨率

android - 动态添加ImageView到LinearLayout出错

java - recyclerview-selection 如何监听 onSelectionEnter 事件和 onSelectionExit 事件

javascript - 如何使用 Javascript 无限期地向表单添加字段?

Android:许多相同的按钮,onclick 某些情况下不起作用

java - 在使用 libgdx 中的 scene2d 按钮时需要帮助

image - 在按钮中居中图标和文本 Xamarin XAML

javascript - 移动网页中的按钮