将Xamarin(Android)触摸事件坐标映射到webview像素
我在android xamarin应用程序中有一个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
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);
}
请尝试将其标记为答案,这将帮助其他有类似问题的人。