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;
    }
}
相关推荐
松☆13 小时前
终章:构建完整生态——Flutter + OpenHarmony 分布式应用开发全景指南(含性能调优与发布实践)
flutter·wpf
松☆13 小时前
高阶实战:基于 Flutter 的 OpenHarmony 分布式软总线多设备协同应用开发
wpf
松☆13 小时前
终极挑战:Flutter 应用在 OpenHarmony 上实现跨设备无缝流转(Continuation)与软总线协同
flutter·wpf
她说彩礼65万14 小时前
WPF SynchronizationContext的使用
wpf
云雾J视界14 小时前
分布式AI框架选型困局:SintolRTOS vs Ray vs Horovod,性能压测全解析
tensorflow·wpf·horovod·ray·分布式ai·sintolrtos
豫狮恒1 天前
OpenHarmony Flutter 分布式多模态交互:融合音视频、手势与环境感知的跨端体验革新
flutter·wpf·openharmony
豫狮恒1 天前
OpenHarmony Flutter 分布式数据共享实战:从基础存储到跨设备协同
flutter·wpf·openharmony
500841 天前
鸿蒙 Flutter 隐私合规:用户授权中心与数据审计日志
flutter·华为·开源·wpf·音视频
豫狮恒1 天前
OpenHarmony Flutter 分布式软总线实战:跨设备通信的核心技术与应用
flutter·wpf·harmonyos
Hello.Reader1 天前
Flink SQL 的 LIMIT 子句语义、坑点与实战技巧
sql·flink·wpf