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 (将#修改为@)