试图避免显示相同的图像两次
本文关键字:图像 两次 显示 | 更新日期: 2023-09-27 17:50:34
我正在使用图片框显示图像,并以一秒的间隔计时。我试图避免连续两次显示相同的图像,并使用数组列表来做到这一点,以避免相同的随机图像跟随在另一个。
这就是我所做的。工作不像我预期的那样好,最终得到一个异常。如何改进这一点,以避免连续两次显示相同的图像?
Random random = new Random();
ArrayList imagesList = new ArrayList();
Image[] images = { imageOne, imageTwo, imageThree, imageFour, imageFive, imageSix, imageSeven };
do
{
try
{
for (int i = 0; i < images.Length; i++)
{
imagesList.Add(images[random.Next(0, 7)]);
while (imagesList.Contains(images[i]))
{
imagesList.Clear();
imagesList.Add(images[random.Next(0, 7)]);
}
picImage.Image = (Image)imagesList[0];
}
Thread.Sleep(1000);
}
catch (IndexOutOfRangeException ind)
{
MessageBox.Show(ind.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception exe)
{
MessageBox.Show(exe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} while (true);
}
您可以进行洗牌而不是获得随机数。这样,您就不需要每次检查图像是否已经被使用。看看这里如何洗牌一个数组:http://www.dotnetperls.com/shuffle。现在你可以循环遍历数组,它现在是随机化的,你不会得到重复项。
我猜你使用睡眠是为了避免每次都得到相同的随机值?你现在可以把它删掉。除此之外,它还会阻塞UI
重新排列图片:
Image[] randomOrder = images.OrderBy(i => Guid.NewGuid()).ToArray();
并遍历该数组
您还需要使用计时器来更改图像,因为您当前正在阻塞UI线程。System.Windows.Forms.Timer
是合适的。计时器的Tick
事件处理程序看起来像这样:
private int index = 0;
private void Timer_Tick(Object sender, EventArgs args)
{
picImage.Image = randomOrder[index % randomOrder.Length];
index++;
}
这个Timer
类的MSDN示例代码也很有帮助。请注意,框架中有几个可用的Timer
类,这个可能是这里最好的。