我向我的方法发送了不同的图像,我想对此更改插入一些效果。

如何淡入和淡出图像?

 private void ShowImage(Image image, ImageLayout imageLayout, int numberOfSeconds)
    {
        try
        {
            if (this.image_timer != null)
                this.KillImageTimer();

            this.customer_form.DisplayImage(image, imageLayout);

            this.image_timer = new Timer();
            this.image_timer.Tick += (object s, EventArgs a) => NextImage();
            this.image_timer.Interval = numberOfSeconds* 1000;
            this.image_timer.Start();
        }
        catch
        {
            //Do nothing
        }


public void DisplayImage(Image image, ImageLayout imageLayout)
    {
        panel1.BackgroundImage = image;
        panel1.BackgroundImageLayout = imageLayout;
    }

最佳答案

Winforms中没有内置的淡入淡出过渡。

因此,您将需要自己写一个。

我能想到的最简单的方法是使用第二个Panel,它位于第一个Panel上,并且实际上必须位于第一个Panels内,否则透明效果将不起作用。

这是使用两个Timer的设置:

public Form1()
{
    InitializeComponent();

    pan_image.BackgroundImage = someImage;

    pan_layer.Parent = pan_image;
    pan_layer.BackColor = pan_image.BackColor;
    pan_layer.Size = pan_image.Size;
    pan_layer.Location = Point.Empty;
}


对于渐变动画,我使用Timer。这是一个快速的代码示例:

Timer timer1 = new Timer();
int counter = 0;
int dir = 1;               // direction 1 = fade-in..
int secondsToWait = 5;
int speed1 = 25;           // tick speed ms
int speed2 = 4;            // alpha (0-255) change speed

void timer1_Tick(object sender, EventArgs e)
{
    // we have just waited and now we fade-out:
    if (dir == 0)
    {
        timer1.Stop();
        dir = -speed2;
        counter = 254;
        timer1.Interval = speed2;
        timer1.Start();
    }

    // the next alpha value:
    int alpha =  Math.Min(Math.Max(0, counter+= dir), 255);

    button1.Text = dir > 0 ? "Fade In" : "Fade Out";

    // fully faded-in: set up the long wait:
    if (counter >= 255)
    {
        timer1.Stop();
        button1.Text = "Wait";
        timer1.Interval = secondsToWait * 1000;
        dir = 0;
        timer1.Start();


    }
    // fully faded-out: try to load a new image and set direction to fade-in or stop
    else if (counter <= 0)
    {
        if ( !changeImage() )
           {
             timer1.Stop();
             button1.Text = "Done";
           }
        dir = speed2;
    }

    // create the new, semi-transparent color:
    Color col = Color.FromArgb(255 - alpha, pan_image.BackColor);
    // display the layer:
    pan_layer.BackColor = col;
    pan_layer.Refresh();

}


我在一个Button上启动它,并在上面显示当前状态:

private void button1_Click(object sender, EventArgs e)
{

    dir = speed2;
    timer1.Tick += timer1_Tick;
    timer1.Interval = speed1;
    timer1.Start();
}


如您所见,我可以设置两种速度:一种用于控制Tick的速度,一种用于控制每个Color的透明度变化的步骤。

只需将BackgroundColor从图像PanelchangeImage()更改为完全透明并返回,并在指定的秒数之间等待即可创建效果。

最后,我调用函数false更改图像。如果此函数返回Timer,则changeImage永久停止。

我很确定这可以用一种更简洁,更优雅的方式编写,但实际上它是可行的。

更新资料


对于无闪烁的显示,请使用双缓冲控件,例如以下Panel子类:




class DrawPanel : Panel
{
    public DrawPanel()      { DoubleBuffered = true;  }
}


这是List<string> imageFiles的示例实现:

bool changeImage()
{
    if (pan_image.BackgroundImage != null)
    {
        var img = pan_image.BackgroundImage;
        pan_image.BackgroundImage = null;
        img.Dispose();
    }
    pan_image.BackgroundImage = Image.FromFile(imageFiles[index++]);
    return index < imageFiles.Count;
}


它假定了两个类级别的变量:一个int index = 0填充了幻灯片的图像的文件名,另一个。

07-28 01:32
查看更多