Xamarin.forms Xamarin形状泛感觉拖放闪烁

Xamarin.forms Xamarin形状泛感觉拖放闪烁,xamarin.forms,drag-and-drop,frame,draggable,uipangesturerecognizer,Xamarin.forms,Drag And Drop,Frame,Draggable,Uipangesturerecognizer,我想要的是创建一个可以在屏幕上拖动的框,因此我创建了一个扩展Frame的类(但它也可以是绝对布局,而不是BoxView,因为我需要在该框内编写一些内容) 类拖曳箱 using System; using System.Diagnostics; using Xamarin.Forms; namespace PanGesture { public class DragBox : Frame { public DragBox() {

我想要的是创建一个可以在屏幕上拖动的框,因此我创建了一个扩展
Frame
的类(但它也可以是
绝对布局
,而不是
BoxView
,因为我需要在该框内编写一些内容)

类拖曳箱

using System;
using System.Diagnostics;
using Xamarin.Forms;

namespace PanGesture
{
    public class DragBox : Frame
    {
        public DragBox()
        {
            var panGesture = new PanGestureRecognizer();
            this.GestureRecognizers.Add(panGesture);
            panGesture.PanUpdated += OnPanUpdated;
            BorderColor = Color.Blue;
            Padding = 4;
            BackgroundColor = Color.Green;
            Content = new Label
            {
                Text = "Word",
            };
        }

        private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
        {
            switch (e.StatusType)
            {
                case GestureStatus.Started:
                    Debug.WriteLine("DEBUG: start dragging");
                    break;
                case GestureStatus.Running:
                    this.TranslationX = e.TotalX;
                    this.TranslationY = e.TotalY;
                    break;
                case GestureStatus.Completed:
                    Debug.WriteLine("DEBUG: drag ended");
                    break;
            }
        }
    }
}
在主页中,我只是创建了一个DragBox实例 (容器是主页上的
绝对布局
的参考

public partial class HomePage : ContentPage
{
    public HomePage ()
    {
       InitializeComponent ();
       DragBox box = new DragBox();
       AbsoluteLayout.SetLayoutBounds(box, new Rectangle(0.1, 0.1, 0.2, 0.2));
       AbsoluteLayout.SetLayoutFlags(box, AbsoluteLayoutFlags.All);
       container.Children.Add(box);
    }
}
问题是,当我开始拖动长方体时,它会产生闪烁的效果,如下图所示。 如何解决这个问题?或者有没有其他方法来创建可拖动的元素


我使用您的代码,但我没有与您相同的问题,因此我建议您可以在OnPanUpdate事件中尝试以下代码

private double  _xOffset, _yOffset;

 private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Started:

                Debug.WriteLine("DEBUG: start dragging");
                break;
            case GestureStatus.Running:


                this.TranslationX = _xOffset + e.TotalX;
                this.TranslationY = _yOffset + e.TotalY;

                break;
            case GestureStatus.Completed:

                _xOffset = this.TranslationX;

                _yOffset = this.TranslationY;


                Debug.WriteLine("DEBUG: drag ended");
                break;
        }
    }
更新:

我想你可能在PanContainer中有一些问题,请修改你的代码如下

public class PanContainer : ContentView
{

    private double x, y;
    public PanContainer()
    {
        var panGesture = new PanGestureRecognizer();

        panGesture.PanUpdated += OnPanUpdated;
        this.GestureRecognizers.Add(panGesture);                          
    }

    private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Started:

                Debug.WriteLine("DEBUG: start dragging");
                break;
            case GestureStatus.Running:

                Content.TranslationX = x + e.TotalX;
                Content.TranslationY = y + e.TotalY;

                break;
            case GestureStatus.Completed:

                x = Content.TranslationX;
                y = Content.TranslationY;

                Debug.WriteLine("DEBUG: drag ended");
                break;
        }
    }
}
然后是ContentPage.cs:

 public partial class Page1 : ContentPage
{
    public Page1()
    {
        InitializeComponent();
        Label label = new Label() { Text = "Hello world" ,BackgroundColor=Color.Green, WidthRequest=100,HeightRequest=150};
        PanContainer box = new PanContainer();
        box.Content = label;

        container.Children.Add(box);
    }
}   
您不能拖放PanContainer,您只能移动PanContainer的内容,如下所示:


如果我的回复对您有帮助,请记住将我的回复标记为答案,谢谢。

请使用下面的LayoutTo方法,而不是使用TranslateX和TranslateY

private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
   switch (e.StatusType)
   {
      case GestureStatus.Started:
          break;
      case GestureStatus.Running:
          var newRectangle = new Rectangle(e.TotalX, e.TotalY, this.Bounds.Width, this.Bounds.Height);
          this.LayoutTo(newRectangle, easing: Easing.Linear);
          break;
      case GestureStatus.Completed:
         break;
    }
}

现在没有闪烁。

你试过真正的设备吗?这可能只是一个模拟器。@AndresCastro是的,它做同样的事情没有同样的效果:(@Poli97,请查看我的更新,如果我的回复对您有帮助,请记住将我的回复标记为回复,谢谢。好的,谢谢现在拖动工作正常,但还有一件事,当我释放拖动时,要再次拖动它,我必须按盒子的原始起始位置,如果我按我放置它的位置,它不会移动,好像他的“框架”不动,怎么修复?@Poli97,我这边也有同样的效果,我看Content.x和Content.Y都没有原来的位置了,你可以打印
Console.WriteLine(“x=“+Content.x+”Y=“+Content.Y”)
要查看,但我尝试更改内容。x,但似乎无法更改。嗯,好的,那么如何改进Xamarin Forms应用程序中的正确拖放功能呢?您知道其他正确的方法吗?总之,我在您解决我的第一个问题时,在您的答复中加了星号作为答案,因此无论如何,感谢您抽出时间,但请e、 如果你还知道一些关于以Xamarin的形式正确执行拖放操作的知识,请告诉我,我真的需要它来写我的大学论文。谢谢!闪烁已经消失,但现在动画像是延迟了,它与我手指的运动不一致