Как исправить "не удается преобразовать из" TouchTracking.TouchTrackingPoint "в" Xamarin.Forms.Point ""? - PullRequest
0 голосов
/ 20 февраля 2020

надеюсь, что у вас все хорошо.

Я пытался создать в своем приложении простую страницу, которая позволила бы пользователю рисовать на экране, следуя коду, опубликованному Microsoft. Однако я, должно быть, что-то испортил, потому что в настоящее время я сталкиваюсь с ошибкой «не могу конвертировать из« TouchTracking.TouchTrackingPoint »в« Xamarin.Forms.Point »». Кто-нибудь знает как это исправить?

Xaml

<?xml version="1.0" encoding="UTF-8"?>
<pages:PopupPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
             xmlns:tt="clr-namespace:TouchTracking.Forms;assembly=TouchTracking.Forms"
             x:Class="NEA_I_MDL.Misc.Notes_Popup"
             xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup">


      <Grid BackgroundColor="White">

        <skia:SKCanvasView x:Name="CanvasView" PaintSurface="CanvasView_PaintSurface"></skia:SKCanvasView>

        <Grid.Effects>

            <tt:TouchEffect Capture = "True" TouchAction="TouchEffect_TouchAction"></tt:TouchEffect>

        </Grid.Effects>

      </Grid>

</pages:PopupPage>

C#

using SkiaSharp;
using TouchTracking;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using SkiaSharp.Views.Forms;

namespace NEA_I_MDL.Misc
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Notes_Popup 
    {

        Dictionary<long, SKPath> ActivePaths = new Dictionary<long, SKPath>();
        List<SKPath> FinishedPaths = new List<SKPath>();

        SKPaint Paint = new SKPaint
        {

            Style = SKPaintStyle.Stroke,
            Color = SKColors.Black,
            StrokeWidth = 10,
            StrokeCap = SKStrokeCap.Round,
            StrokeJoin = SKStrokeJoin.Round

        };

        public Notes_Popup()
        {
            InitializeComponent();
        }

        private void CanvasView_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
        {

        }

        SkiaSharp.SKPoint ConvertToPixel(Point pt)
        {
            return new SKPoint((float)(CanvasView.CanvasSize.Width * pt.X / CanvasView.Width),(float)(CanvasView.CanvasSize.Height*pt.Y / CanvasView.Height));
        }

        private void TouchEffect_TouchAction(object sender, TouchTracking.TouchActionEventArgs args)
        {

            switch (args.Type)
            {

                case TouchActionType.Pressed:

                    if (!ActivePaths.ContainsKey(args.Id))
                    {
                        SKPath path = new SKPath();
                        path.MoveTo(ConvertToPixel(args.Location));
                        ActivePaths.Add(args.Id, path);
                        CanvasView.InvalidateSurface();
                    }

                    break;

                case TouchActionType.Moved:

                    if(ActivePaths.ContainsKey(args.Id))
                    {
                        SKPath path = ActivePaths[args.Id];
                        path.LineTo(ConvertToPixel(args.Location));
                        CanvasView.InvalidateSurface();
                    }

                    break;

                case TouchActionType.Released:

                    if(ActivePaths.ContainsKey(args.Id))
                    {
                        FinishedPaths.Add(ActivePaths[args.Id]);
                        ActivePaths.Remove(args.Id);
                        CanvasView.InvalidateSurface();
                    }

                    break;

                case TouchActionType.Cancelled:

                    if (ActivePaths.ContainsKey(args.Id))
                    {
                        ActivePaths.Remove(args.Id);
                        CanvasView.InvalidateSurface();
                    }

                break;

            }            

        }

        void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
        {

            SKCanvas Canvas = args.Surface.Canvas;
            Canvas.Clear();

            foreach(SKPath i in FinishedPaths)
            {
                Canvas.DrawPath(i, Paint);
            }

            foreach (SKPath path in ActivePaths.Values)
            {
                Canvas.DrawPath(path, Paint);
            }

        }

    }
}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Спасибо Джейсону, который разработал этот ответ:

добавьте перегрузку для ConvertToPixel, которая принимает TouchTrackingPoint в качестве аргумента

SkiaSharp.SKPoint ConvertToPixel(TouchTrackingPoint pt)
    {
        return new SKPoint((float)(CanvasView.CanvasSize.Width * pt.X / CanvasView.Width), (float)(CanvasView.CanvasSize.Height * pt.Y / CanvasView.Height));
    }
0 голосов
/ 20 февраля 2020

Вы должны использовать SKPoint, если добавляете точку в SKPath. проверьте свой код в строке и измените свои очки на SKPoint.

...