コード例 #1
0
        private Rectangle GetInitialBounds(ViewOverlay overlay, Rectangle fullRect)
        {
            var initValue = Math.Max(overlay.MinSize, overlay.InitialSize);

            overlay.OverlayBounds = fullRect;
            return(GetRect(overlay, initValue));
        }
コード例 #2
0
        private Rectangle GetRect(ViewOverlay overlay, double newSize, double oldSize = -1)
        {
            var x = overlay.OverlayBounds.X;
            var y = overlay.OverlayBounds.Y;
            var w = overlay.OverlayBounds.Width;
            var h = overlay.OverlayBounds.Height;

            var maxValue = TotalHeight;

            if (overlay.IsHorizontal)
            {
                maxValue = TotalWidth;
            }

            var maxAllowed = Math.Min(maxValue, overlay.MaxSize);

            if (newSize <= overlay.MinSize)
            {
                newSize = overlay.MinSize;
            }
            if (newSize >= maxAllowed)
            {
                newSize = maxAllowed;
            }

            if (oldSize > -1)
            {
                if (overlay.OnSizeChange != null)
                {
                    overlay.OnSizeChange.Invoke(this, new ViewSizeArgs()
                    {
                        Old = oldSize,
                        New = newSize
                    });
                }
            }
            switch (overlay.Type)
            {
            case OverlayType.Bottom:
                y = maxValue - newSize;
                break;

            case OverlayType.Top:
                y = -newSize;
                break;

            case OverlayType.Left:
                x = -newSize;
                break;

            case OverlayType.Right:
                x = maxValue - newSize;
                break;
            }

            return(new Rectangle(x, y, w, h));
        }
コード例 #3
0
 private void SetOverlaySize(ViewOverlay ov, double ns)
 {
     if (!ov.active)
     {
         //ov.Bounds = GetRect(ov, ns);
         ov.offset = -ns;
         UpdateLayout(ov);
     }
 }
コード例 #4
0
        public void AddOverlay(ViewOverlay overlay)
        {
            Overlays.Add(overlay);

            if (overlay.ShadowView != null)
            {
                overlay.UseShadow            = true;
                overlay.ShadowView.IsEnabled = false;
                overlay.ShadowView.Opacity   = 0;

                // Ugly as piiip....
                Device.BeginInvokeOnMainThread(() =>
                {
                    if (overlay.ShadowView != null)
                    {
                        Children.Add(overlay.ShadowView);
                        RaiseChild(overlay);
                    }
                });
            }



            var gest = new PanGestureRecognizer();

            gest.PanUpdated += (sender, e) =>
            {
                switch (e.StatusType)
                {
                case GestureStatus.Started:
                    overlay.active = true;
                    break;

                case GestureStatus.Running:
                    overlay.lastOffset = overlay.offset;
                    overlay.offset     = overlay.IsHorizontal ? e.TotalX : e.TotalY;
                    break;

                case GestureStatus.Completed:
                    overlay.active = false;
                    break;
                }
                UpdateLayout(overlay);
            };
            overlay.GestureRecognizers.Add(gest);
            ForceLayout();
        }
コード例 #5
0
        private void UpdateLayout(ViewOverlay overlay)
        {
            var orgSize  = overlay.OverlayBounds.Height - overlay.OverlayBounds.Y;
            var maxValue = TotalHeight;

            switch (overlay.Type)
            {
            case OverlayType.Top:
                orgSize = -overlay.OverlayBounds.Y;
                break;

            case OverlayType.Left:
                orgSize  = -overlay.OverlayBounds.X;
                maxValue = TotalWidth;
                break;

            case OverlayType.Right:
                orgSize  = overlay.OverlayBounds.Width - overlay.OverlayBounds.X;
                maxValue = TotalWidth;
                break;
            }
            var maxAllowed = Math.Min(maxValue, overlay.MaxSize);
            var newSize    = (orgSize - overlay.offset);

            var backgroundOpacity = GetBackgroundOpacity(maxAllowed, newSize);

            if (overlay.active)
            {
                if (overlay.UseShadow)
                {
                    overlay.ShadowView.Opacity = backgroundOpacity * 0.5f;
                    if (overlay is DrawerControl dc)
                    {
                        dc.BackgroundOpacity = backgroundOpacity;
                    }
                }
                overlay.Layout(GetRect(overlay, newSize, orgSize));
            }
            else
            {
                var delta    = overlay.lastOffset - overlay.offset;
                var absDelta = Math.Abs(delta);
#if DEBUG
                Console.WriteLine("Drag delta: " + delta);
#endif
                if (absDelta > 14)
                {
                    newSize = (delta > 0) ? maxValue : overlay.MinSize;
                }
                else if (absDelta > 4)
                {
                    newSize += (delta * 4);
                }
                var rect = GetRect(overlay, newSize, orgSize);
                backgroundOpacity = GetBackgroundOpacity(maxAllowed, newSize);
                overlay.LayoutTo(rect, 300, overlay.Easing);
                if (overlay.UseShadow)
                {
                    overlay.ShadowView.FadeTo(backgroundOpacity * 0.5f, 300, Easing.Linear);
                    if (overlay is DrawerControl dc)
                    {
                        dc.BackgroundOpacity = backgroundOpacity;
                    }
                }
                overlay.OverlayBounds = rect;
                overlay.offset        = 0;
            }
        }
コード例 #6
0
 public void MaximizeOverlay(ViewOverlay ov)
 {
     SetOverlaySize(ov, 99999);
 }
コード例 #7
0
 public void Minimize(ViewOverlay sliderOverlay)
 {
     SetOverlaySize(sliderOverlay, 0);
 }
コード例 #8
0
 public void Rezise(ViewOverlay ov, float percent)
 {
     SetOverlaySize(ov, TotalHeight * (percent / 100f));
 }