首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin pan手势识别器没有给出准确的坐标

Xamarin pan手势识别器没有给出准确的坐标
EN

Stack Overflow用户
提问于 2016-09-13 04:11:25
回答 4查看 3.9K关注 0票数 2

我正在用一个手势识别器做一些测试。设置非常简单,我有一个20x20的框视图,并且是由相对布局设置的。平移手势的处理程序

代码语言:javascript
运行
复制
switch (args.StatusType)
            {
                case GestureStatus.Running:
                    box.TranslationX = box.X + args.TotalX;
                    box.TranslationY = box.Y + args.TotalY;
                    break;
                case GestureStatus.Completed:
                    box.TranslationX = 0;
                    box.TranslationY = 0;
                    break;
            }

所以它运行正常,但是当我尝试在屏幕上拖动boxview时,它不能正确地转换这些值。当它试图重新绘制方框时,它也会产生非常糟糕的闪烁效果。有没有更好的方法来做这件事?有没有办法消除闪光?

EN

回答 4

Stack Overflow用户

发布于 2018-10-23 23:07:55

好吧,如果是你的盒子有PanGestureRecognizer,闪烁的效果很简单,因为TotalX和TotalY是相对于盒子转换坐标的。

试着改变

代码语言:javascript
运行
复制
box.TranslationX = box.X + args.TotalX;
box.TranslationY = box.Y + args.TotalY;

通过

代码语言:javascript
运行
复制
box.TranslationX = box.TranslationX + args.TotalX;
box.TranslationY = box.TranslationY + args.TotalY;

应该能行得通。

编辑:它只与Xamarin Android有关,它对UWP的工作方式不同。

票数 2
EN

Stack Overflow用户

发布于 2016-10-04 14:34:37

我在Xamarin论坛上找到了一个可以帮助你解决问题的实现(Pinch and Pan gesture recognizers not working on Android project)。下面是Pan的实现,我用我的项目测试了它,并注意到“闪烁”效果不再存在:

代码语言:javascript
运行
复制
private double startScale, currentScale, xOffset, yOffset, startX, startY;
...
public void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
    switch (e.StatusType)
    {
        case GestureStatus.Started:
            startX = e.TotalX;
            startY = e.TotalY;
            Content.AnchorX = 0;
            Content.AnchorY = 0;
            break;

        case GestureStatus.Running:
            var maxTranslationX = Content.Scale * Content.Width - Content.Width;
            Content.TranslationX = Math.Min(0, Math.Max(-maxTranslationX, xOffset + e.TotalX - startX));

            var maxTranslationY = Content.Scale * Content.Height - Content.Height;
            Content.TranslationY = Math.Min(0, Math.Max(-maxTranslationY, yOffset + e.TotalY - startY));
            break;

        case GestureStatus.Completed:
            xOffset = Content.TranslationX;
            yOffset = Content.TranslationY;
            break;
    }
}

如果这有帮助,请告诉我。

票数 1
EN

Stack Overflow用户

发布于 2019-02-13 14:56:12

扩展Julien的解决方案,它为我解决了这个问题(在安卓上)……

包含在PanUpdatedEventArgs,中的平移手势坐标可以被截取并重新计算,以对BoxView本身的移动进行计数。然后将新的参数传递给另一个处理程序:

代码语言:javascript
运行
复制
    public void Handle_PanUpdated(object sender, Xamarin.Forms.PanUpdatedEventArgs e)
    {
        double TranslationX = box.TranslationX;
        double TranslationY = box.TranslationY;

        double TotalX_Modified = e.TotalX + TranslationX;
        double TotalY_Modified = e.TotalY + TranslationY;

        if (Device.RuntimePlatform == Device.Android)
        { 
            e = new PanUpdatedEventArgs(e.StatusType, e.GestureId, TotalX_Modified, TotalY_Modified);
        }

        Handle_PanUpdate_Modified(sender, e);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39458078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档