微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SkiaSharp for Winforms或Xamarin,选择无矩形形状

如何解决SkiaSharp for Winforms或Xamarin,选择无矩形形状

我在Winforms中使用SkiaSharp。我以前曾将SkiaSharp和Xamarin一起使用过,但是使用程度不是很高。

我已经使用MouseClick MouseDown,MouseMove和MouseUp事件在画布上选择和移动对象。

        private void LabelEdit_MouseClick(object sender,MouseEventArgs e)
        {
            var pt = e.Location;
            var point = new SKPoint((float)(LabelEdit.CanvasSize.Width * pt.X / LabelEdit.Width),(float)(LabelEdit.CanvasSize.Height * pt.Y / LabelEdit.Height));
            var componentList = new List<(IComponentItem component,float area)>();

            foreach (var component in LabelEdit.Components)
            {
                var rect = new SKRect(component.ScaledBounds.Left,component.ScaledBounds.Top,component.ScaledBounds.Right,component.ScaledBounds.Bottom);

                rect = matrix.MapRect(rect);

                if (rect.Contains(point))
                {
                    componentList.Add((component,rect.Width * rect.Height));
                }
            }

            if (componentList.Count() == 0) return;
            var selectedComponent = componentList.Where(y => y.area == componentList.Min(x => x.area)).Select(x => x.component).FirstOrDefault();

            selectedComponent.Selected = !selectedComponent.Selected;

            LabelEdit.Invalidate();

            UpdateControls();
        }
        private void LabelEdit_MouseDown(object sender,MouseEventArgs e)
        {
            var pt = e.Location;
            clickedPos = new SKPoint((float)(LabelEdit.CanvasSize.Width * pt.X / LabelEdit.Width),(float)(LabelEdit.CanvasSize.Height * pt.Y / LabelEdit.Height));
            mouseMove = true;
        }
        private void LabelEdit_MouseMove(object sender,MouseEventArgs e)
        {
            if (!mouseMove) return;

            var pt = e.Location;
            var point = new SKPoint(LabelEdit.CanvasSize.Width * pt.X / LabelEdit.Width,LabelEdit.CanvasSize.Height * pt.Y / LabelEdit.Height);
            var components = LabelEdit.Components.Where(x => x.Selected == true);

            if (components.Count() == 0) return;

            var xTrans = (point.X - clickedPos.X) / matrix.ScaleX;
            var yTrans = (point.Y - clickedPos.Y) / matrix.ScaleY;
            clickedPos = point;

            foreach (var component in components)
            {
                component.Translate(xTrans,yTrans);
            }
            LabelEdit.Invalidate();

            UpdateControls();
        }
        private void LabelEdit_MouseUp(object sender,MouseEventArgs e)
        {
            mouseMove = false;
        }

我创建的代码将允许我选择/突出显示一个矩形,但是这些对象可以旋转或倾斜,这意味着它们不是矩形。

是否可以为矩形以外的形状(例如菱形)创建触摸检测。

非常感谢

Benn Shelfer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。