Pan Container 实现简单拖拽动画,防止收拾冲突

参考xamarin官方文档 : https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/gestures/pan/

项目小需求:仿照ios原点实现在屏幕随意拖拽和点击

完成过程中发现拖拽动画和点击时间会冲突(安卓)

提炼官方文档代码 :

首先新建 blankpage 集成 ContentPage , 在构造函数中布局 :

```

Content = new AbsoluteLayout

            {

                Padding = new Thickness(20),

                Children =

                {

                    new PanContainer

                    {

                        Content = new Image {

                        Source = ImageSource.FromFile ("icon.jpg"),

                        WidthRequest = 1024,

                        HeightRequest = 768

                        }

                    }

                }

            };

```

自定义拖动view , 主要自定义拖动的范围和动画的状态

```

public class PanContainer : ContentView

    {

        double x, y;

        public PanContainer()

        {

            // Set PanGestureRecognizer.TouchPoints to control the

            // number of touch points needed to pan

            var panGesture = new PanGestureRecognizer();

            panGesture.PanUpdated += OnPanUpdated;

            GestureRecognizers.Add(panGesture);

        }

        private void TapedEventHander(object sender, EventArgs e)

        {

        }

        void OnPanUpdated(object sender, PanUpdatedEventArgs e)

        {

            switch (e.StatusType)

            {

                case GestureStatus.Running:

                    // Translate and ensure we don't pan beyond the wrapped user interface element bounds.

                    Content.TranslationX =

                      Math.Max(Math.Min(0, x + e.TotalX), -Math.Abs(Content.Width - App.ScreenWidth));

                    Content.TranslationY =

                      Math.Max(Math.Min(0, y + e.TotalY), -Math.Abs(Content.Height - App.ScreenHeight));

                    break;

                case GestureStatus.Completed:

                    // Store the translation applied during the pan

                    x = Content.TranslationX;

                    y = Content.TranslationY;

                    break;

            }

        }

    }

```

以上代码便可以实现一个简单的拖拽动画

在OnPanUpdated这个事件里面 , 分别有4种状态 , Started , Running , Completed , Canceled

Started : 手指按下去

Running : 手指移动

Completed : 收拾抬起来

Canceled : 取消 , 但是测试状态未测到这个状态

输出日志 :

```

--------start-----------03-13 01:02:38.537

--------move-----------03-13 01:02:38.553

--------move-----------03-13 01:02:38.662

--------move-----------03-13 01:02:38.692

--------end-----------03-13 01:02:44.180

```

根据上面的输出结果 , 我们可以根据开始时间和结束的时间差来解决手势冲突的问题

在手势开始的状态记录手指点下去的时间 , 结束时计算时间差

```

case GestureStatus.Started:

                    StartTime = DateTime.Now;

case GestureStatus.Completed:

                    offsetX = this.TranslationX;

                    offsetY = this.TranslationY;

                    TimeSpan timespan = DateTime.Now - StartTime;

                    MoveTimeSpan = timespan.Milliseconds + timespan.Seconds * 1000;

```

之后我们需要在使用的时候实现点击事件 :

```

private void TapedEventHander(object sender, EventArgs e)

        {

            var touchPanContainere = sender as PanContainer ;

            if (touchPanContainere.MoveTimeSpan < 500)

            {

                    todo点击事件

            }

            touchPanContainere.MoveTimeSpan = 0;

        }

```


同时要考虑手势的范围 , 防止拖拽屏幕之外 , 我们要在移动GestureStatus.Running的时候限制动画的偏移量:

case GestureStatus.Running:


                    this.Content.TranslationX = e.TotalX;

                    if (e.TotalX+ offsetX <= -(App.Current.MainPage.Width-Width))

                    {

                        this.Content.TranslationX = -(App.Current.MainPage.Width - Width + offsetX);

                    }

                    if (e.TotalX+ offsetX >= 0)

                    {

                        this.Content.TranslationX = - offsetX;


                    }


                    this.Content.TranslationY = e.TotalY;

                    if (e.TotalY + offsetY <= -(App.Current.MainPage.Height - Height - 140))

                    {

                        this.Content.TranslationY = -(App.Current.MainPage.Height - Height - 140 + offsetY);

                    }

                    if (e.TotalY + offsetY >= 0)

                    {

                        this.Content.TranslationY = -offsetY;

                    }


                    break;

                case GestureStatus.Completed:


                    offsetX += Content.TranslationX;

                    offsetY += Content.TranslationY;

                    Content.TranslationX = 0;

                    Content.TranslationY = 0;

                    this.TranslationX = offsetX;

                    this.TranslationY = offsetY;

                    TimeSpan timespan = DateTime.Now - StartTime;

                    MoveTimeSpan = timespan.Milliseconds + timespan.Seconds * 1000;

                    break;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容

  • 重新框定问题,改变逻辑种类层次,理解起来很容易,难度在于当事人不愿迈出原有的框框,即使旁人能够清晰支出新的框架,当...
    亦周阅读 485评论 0 49
  • 当我通过学习知道“成交一切为了爱”这句话,但我并不知道它的真正含义时,这句话只是一句口号。 当我学会被成交时,我感...
    宣力亢阅读 882评论 0 0
  • wxml template css [github上的开源demo][1][1]:https://github.c...
    EnjoyWT阅读 158评论 0 0
  • 母亲天生丽质,一辈子不爱化妆,不尚华衣美服,不好珍馐美味,对旅游和交友也不是很热衷,她的乐趣一是读唐诗,二...
    邓鼎鼎阅读 487评论 3 3