我在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像素。我以为它与设备上的像素密度有关,但是我不确定如何将这些值转换为适用于所有设备的通用方式的“网络像素”。
我尝试使用谷歌搜索,阅读文档并在此处搜索答案,但似乎找不到我想要的东西。可能未使用正确的术语。任何帮助表示赞赏。
答案 0 :(得分:1)
我相信我已经知道了,这是解决方案:
public static float ConvertDpToPixel(float dp, Context context)
{
return dp / ((float)context.Resources.DisplayMetrics.DensityDpi / (float)DisplayMetricsDensity.Default);
}