Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Xamarin(Android)触摸事件坐标映射到webview像素_Android_Xamarin - Fatal编程技术网

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

将Xamarin(Android)触摸事件坐标映射到webview像素,android,xamarin,Android,Xamarin,我在android xamarin应用程序中有一个webview。当用户向左或向右滑动屏幕时,我需要检查滑动是否发生在特定元素上。要处理刷卡逻辑,我使用以下代码: float startY = 0; private void BindTouchEvents() { float startX = 0; float webViewWidth = 0; webView.Touch += (sender, e) => { if (e.Event.Actio

我在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调用调用webview中的一些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像素。我假设它与我的设备上的像素密度有关,但我不确定如何以一种通用的方式将这些值转换为网络像素,这种方式可以在所有设备上使用


我尝试过谷歌搜索,阅读文档,在这里搜索答案,但似乎找不到我想要的。可能没有使用正确的术语。非常感谢您的帮助。

我想我找到了解决方案:

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

请尝试将其标记为答案,这将帮助其他有类似问题的人。