WPF中手写地图控件(3)——动态加载地图图片

瓦片增加一个Loading动画

可以查看我的另一个博客WPF中自定义Loading图

从中心扩散

进行从里到外的扩散,方向是上左下右。如下图所示

于是我们可以定义一个拥有坐标X跟Y的集合,他允许这个集合,内部使用枚举器的MoveNext自动排序,中心的在前,外面在后。

复制代码
public class SpiralArray : IEnumerable<(int, int)>
{

    protected (int, int) Range;

    public SpiralArray((int, int) range)
    {
        Range = range;
    }

    public IEnumerator<(int, int)> GetEnumerator()
    {
        return new SpiralArrayIEnumerator(Range);
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

public class SpiralArrayIEnumerator : IEnumerator<(int, int)>
{
    public int Start;
    public int End;

    public int CenterX;
    public int CenterY;

    private bool IsOver = false;
    private int Direction = 0;// 0 上 1 左 2 : 下 3 : 右
    private int Step = 0;
    private int CurrentMoveSteps = 0;
    private int ChangedDirectionTimes = 0;  //改变方向次数
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="range"></param>
    public SpiralArrayIEnumerator((int, int) range)
    {
        Start = range.Item1;
        End = range.Item2;
        Reset();
    }
    public (int, int) Current { get; set; }
    object IEnumerator.Current => Current;
    public void Dispose()
    {

    }

    public bool MoveNext()
    {
        if(Step == 0)
        {
            Current = (CenterX, CenterY);
            CurrentMoveSteps = 0;
            Step = 1;
            return true;
        }
        else
        {
            // 走一步
            CurrentMoveSteps++;
            // 改变方向
            if(CurrentMoveSteps > Step)
            {
                Direction = (Direction + 1) % 4;
                CurrentMoveSteps = 1;
                ChangedDirectionTimes++;
                if(ChangedDirectionTimes >= 2)
                {
                    // 步长 + 1
                    Step++;
                    ChangedDirectionTimes = 0;
                }
            }
            Move();
            if(Current.Item1 >= End || Current.Item2 >= End || Current.Item1 < Start || Current.Item2 < Start)
                return false;
            return true;
        }
    }
    /// <summary>
    /// 移动一步
    /// </summary>
    private void Move()
    {
        switch (Direction)
        {
            // 上
            case 0:
                Current = (Current.Item1, Current.Item2 - 1);
                break;
            // 左
            case 1:
                Current = (Current.Item1 - 1, Current.Item2);
                break;
            // 下
            case 2:
                Current = (Current.Item1, Current.Item2 + 1);
                break;
            // 右
            case 3:
                Current = (Current.Item1 + 1, Current.Item2);
                break;
            default:
                break;
        }
    }

    public void Reset()
    {
        CenterX = (End + Start) / 2;
        CenterY = (End + Start) / 2;
        Current = (CenterX, CenterY);
        Direction = 0;
        Step = 0;
        ChangedDirectionTimes = 0;
        IsOver = false;
    }
}
相关推荐
执笔论英雄4 小时前
【大模型推理】VLLM 引擎使用
wpf·vllm
LateFrames4 小时前
动画性能比对:WPF / WinUI3 / WebView2
wpf·webview·用户体验·winui3
阿湯哥1 天前
多智能体架构深度解析:企业落地如何选择Skills与SubAgents?
架构·wpf
源之缘-OFD先行者1 天前
自研 WPF 鸟情图表:性能与灵活的双重突破
wpf
Moqiqiuzi1 天前
WPF单实例启动
wpf
Moqiqiuzi1 天前
WPF程序打包成安装包的方法
wpf
码农水水2 天前
国家电网Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·网络·分布式·面试·wpf
码农水水2 天前
京东Java面试被问:HTTP/2的多路复用和头部压缩实现
java·开发语言·分布式·http·面试·php·wpf
闻缺陷则喜何志丹2 天前
【C# WPF】TextBox的数据绑定
ui·c#·wpf·mvvm·数据绑定·textbox
码农水水3 天前
得物Java面试被问:大规模数据的分布式排序和聚合
java·开发语言·spring boot·分布式·面试·php·wpf