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;
    }
}
相关推荐
光泽雨1 天前
动画生命周期
c#·wpf
nap1173 天前
WPF 中常用的 LINQ 语句
wpf
做个文艺程序员6 天前
MQ第12篇:AI原生消息架构演进:从MQ到事件驱动的全链路设计
架构·消息队列·wpf·事件驱动架构·ai-native·cqrs
donk13147 天前
React Native for OpenHarmony 实战:三方库 react-native-circular-action-menu 的鸿蒙化适配指南
javascript·分布式·react native·react.js·wpf·harmonyos
donk13148 天前
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南
分布式·react native·react.js·wpf·harmonyos
He BianGu8 天前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
VidDown8 天前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
He BianGu8 天前
【笔记】WPF中CachingHint的功能
笔记·wpf
He BianGu9 天前
【笔记】在WPF中BitmapScalingMode的作用
笔记·wpf