【发布时间】:2019-12-23 05:28:49
【问题描述】:
我已经关注了here 中的滑块,但我想实现真正的 android 滑块,如下面的图像拖动到下所述。
同(向下滑动):
任何人有想法请在这里分享。我尝试了很多,但都没有成功。
@Lucas Zhang,有你的想法吗?
【问题讨论】:
标签: android ios xamarin slider
我已经关注了here 中的滑块,但我想实现真正的 android 滑块,如下面的图像拖动到下所述。
同(向下滑动):
任何人有想法请在这里分享。我尝试了很多,但都没有成功。
@Lucas Zhang,有你的想法吗?
【问题讨论】:
标签: android ios xamarin slider
<AbsoluteLayout BackgroundColor="White" AbsoluteLayout.LayoutBounds="0,1,1,1">
<!-- -->
<StackLayout x:Name="bottomDrawer" BackgroundColor="Olive" AbsoluteLayout.LayoutBounds="0.5,1.00,0.9,0.04" AbsoluteLayout.LayoutFlags="All">
<StackLayout.GestureRecognizers>
<PanGestureRecognizer PanUpdated="PanGestureHandler" />
</StackLayout.GestureRecognizers>
<!-- put the content of panel slider here -->
</StackLayout>
</AbsoluteLayout>
double? layoutHeight;
double layoutBoundsHeight;
int direction;
const double layoutPropHeightMax = 0.75;
const double layoutPropHeightMin = 0.04;
void PanGestureHandler(object sender, PanUpdatedEventArgs e)
{
layoutHeight = layoutHeight ?? ((sender as StackLayout).Parent as AbsoluteLayout).Height;
switch (e.StatusType)
{
case GestureStatus.Started:
layoutBoundsHeight = AbsoluteLayout.GetLayoutBounds(sender as StackLayout).Height;
break;
case GestureStatus.Running:
direction = e.TotalY < 0 ? 1 : -1;
break;
case GestureStatus.Completed:
if (direction > 0)
{
Device.BeginInvokeOnMainThread(async () =>
{
var height = layoutPropHeightMin;
while (height < layoutPropHeightMax)
{
await Task.Delay(2);
height += 0.04;
AbsoluteLayout.SetLayoutBounds(bottomDrawer, new Rectangle(0.5, 1.00, 0.9, height));
}
});
}
else
{
Device.BeginInvokeOnMainThread(async () =>
{
var height = layoutPropHeightMax;
while (height > layoutPropHeightMin)
{
await Task.Delay(2);
height -= 0.04;
AbsoluteLayout.SetLayoutBounds(bottomDrawer, new Rectangle(0.5, 1.00, 0.9, height));
}
});
}
break;
}
}
因为我们使用了 AbsoluteLayout 。当您想在面板中添加子控件时,最好设置AbsoluteLayout.LayoutBounds 而不是HeightRequest 或WidthRequest。
【讨论】:
AbsoluteLayout代替StackLayout。