将Xamarin(Android)触摸事件坐标映射到Webview像素

时间:2019-01-11 17:22:25

标签: android xamarin

我在android xamarin应用程序中有一个webview。当用户向左或向右滑动屏幕时,我需要检查滑动是否发生在特定元素上。为了处理滑动逻辑,我使用了以下代码:

float startY = 0;
private void BindTouchEvents() {
    float startX = 0;
    float webViewWidth = 0;

    webView.Touch += (sender, e) => {
        if (e.Event.Action == Android.Views.MotionEventActions.Down)
        {
            webViewWidth = webView.Width;

            startX = e.Event.GetX();
            startY = e.Event.RawY; //I've tried both GetY and RawY here
        }
        if (e.Event.Action == Android.Views.MotionEventActions.Up)
        {
            float movement = e.Event.GetX() - startX;
            float offset = webViewWidth / 2;

            if (Math.Abs(movement) > offset)
            {
                if (movement < 0)
                {

                    client.NotifyTouch(webView, e.Event.GetX(), startY, "SwipeLeft");
                }
                else
                {
                    client.NotifyTouch(webView, e.Event.GetX(), startY, "SwipeRight");

                }
            }
        }
        e.Handled = false;
    };
}

client.NotifyTouch调用在Web视图中调用一些javascript,以确定是否在特定元素上发生了滑动事件。如果确实如此,它将把该元素的可见性切换为隐藏。元素位于0,0的固定位置,高度为64px,因此此逻辑非常简单:

$scope.$on('received-touch-event', function (e, args) {     
    if ($scope.showLaunchNavBar && (args.event === "SwipeLeft" || args.event === "SwipeRight") && args.y > 0 && args.y < 64) {
        $scope.showLaunchNav(false);
    };          
});

问题是startY值似乎无法平均转换为Webview像素。例如,如果我尝试在0,0​​处大致滑动并检查起始Y位置是否在100上方,如果我尝试在0,64处大致滑动,则起始Y位置最终会高于400。我需要弄清楚如何将这些值转换为WebView像素。我以为它与设备上的像素密度有关,但是我不确定如何将这些值转换为适用于所有设备的通用方式的“网络像素”。

我尝试使用谷歌搜索,阅读文档并在此处搜索答案,但似乎找不到我想要的东西。可能未使用正确的术语。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我相信我已经知道了,这是解决方案:

public static float ConvertDpToPixel(float dp, Context context)
{
    return dp / ((float)context.Resources.DisplayMetrics.DensityDpi / (float)DisplayMetricsDensity.Default);
}