C#图片动画效果(旋转360度)异步

  private void Button1_Click(object sender, EventArgs e)
        {
         
            
            Graphics graphics = this.CreateGraphics();
            graphics.Clear(Color.White);

            //装入图片 资源

            //Bitmap image = new Bitmap(WindowsFormsApplication1.Properties.Resources.image_101);
            Bitmap image = new Bitmap(HZH_Controls.Properties.Resources.alarm);

            //获取当前窗口的中心点

            Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
            PointF center = new PointF(rect.Width / 2, rect.Height / 2);

            float offsetX = 0;
            float offsetY = 0;
            offsetX = center.X - image.Width / 2;
            offsetY = center.Y - image.Height / 2;
            //构造图片显示区域:让图片的中心点与窗口的中心点一致
            RectangleF picRect = new RectangleF(offsetX, offsetY, image.Width, image.Height);
            PointF Pcenter = new PointF(picRect.X + picRect.Width / 2,
                picRect.Y + picRect.Height / 2);
            Color c = Color.FromArgb(200, 200, 200);


            //让图片绕中心旋转一周
            for (int i = 360; i > 0; i -= 10)
            {
                // 绘图平面以图片的中心点旋转
                graphics.TranslateTransform(Pcenter.X, Pcenter.Y);


                graphics.RotateTransform(i);
                //恢复绘图平面在水平和垂直方向的平移
                graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);
                //绘制图片并延时
                graphics.DrawImage(image, picRect);
                Thread.Sleep(100);
                graphics.Clear(c);

                //重置绘图平面的所有变换
                graphics.ResetTransform();
            }
        }

 以上代码是同步的,用户体验不好。

下面是经过改善的异步方法

  private void Button1_Click(object sender, EventArgs e)
        {
            Graphics graphics = this.CreateGraphics();
            graphics.Clear(Color.White);

            //装入图片 资源

            //Bitmap image = new Bitmap(WindowsFormsApplication1.Properties.Resources.image_101);
            Bitmap image = new Bitmap(HZH_Controls.Properties.Resources.alarm);

            //获取当前窗口的中心点

            Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
            PointF center = new PointF(rect.Width / 2, rect.Height / 2);

            float offsetX = 0;
            float offsetY = 0;
            offsetX = center.X - image.Width / 2;
            offsetY = center.Y - image.Height / 2;
            //构造图片显示区域:让图片的中心点与窗口的中心点一致
            RectangleF picRect = new RectangleF(offsetX, offsetY, image.Width, image.Height);
            PointF Pcenter = new PointF(picRect.X + picRect.Width / 2,
                picRect.Y + picRect.Height / 2);

            Action<Graphics, PointF, Bitmap, RectangleF> action = test;//声明委托
            action.BeginInvoke(graphics, Pcenter, image, picRect,null,null);//异步调用
        }
        static void test(Graphics graphics,PointF Pcenter,Bitmap image, RectangleF picRect) {
            //让图片绕中心旋转一周
            Color c = Color.FromArgb(200, 200, 200);
            for (int i = 360; i > 0; i -= 10)
            {
                // 绘图平面以图片的中心点旋转
                graphics.TranslateTransform(Pcenter.X, Pcenter.Y);


                graphics.RotateTransform(i);
                //恢复绘图平面在水平和垂直方向的平移
                graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);
                //绘制图片并延时
                graphics.DrawImage(image, picRect);
                Thread.Sleep(100);
                graphics.Clear(c);

                //重置绘图平面的所有变换
                graphics.ResetTransform();
            }
        }

 

转载于:https://www.cnblogs.com/topsyuan/p/11589030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值