xamarin - 如何在 Android 中禁用轮播页面滚动
问题描述
使用自定义渲染器可以禁用CarouselPage
on的滑动手势,iOS
如下所示:
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace App.iOS
{
public class CustomCarouselPageRenderer : CarouselPageRenderer
{
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
UIView view = this.NativeView;
UIScrollView scrollView = (UIKit.UIScrollView)view.Subviews[0];
scrollView.ScrollEnabled = false;
}
}
}
如何在 Android 上实现相同的功能?
using Android.Content;
using XamFormsApp.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace StixApp.Droid.Renderers
{
public class CustomCarouselPageRenderer : VisualElementRenderer<CarouselPage>
{
public CustomCarouselPageRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
{
base.OnElementChanged(e);
var view = this.RootView;
X
X
}
}
}
似乎没有办法以Subviews
相同的方式访问。可以Children
这样访问
Android.Views.View view = (Android.Views.View)GetChildAt(i);
如何知道哪个Child
是ScrollView
如果有的话?
使用循环来检查这个,就像这样,
for (int i = 0; i < ChildCount; ++i)
{
Android.Views.View view = (Android.Views.View)GetChildAt(i);
if (view is ScrollView)
{
}
}
产生以下结果:“给定的表达式永远不是提供的 ( ScrollView
) 类型”
所以!如何以非常优雅的方式禁用CarouselPage
滑动/滚动?iOS
更新:请参阅示例解决方案。
解决方案
有几件事。
对于Android,您正在寻找的视图不是 aScrollView
而是ViewPager
.
这可以使用GetChildAt方法在索引 0 下找到。
另外,为什么要VisualElementRenderer<CarouselPage>
用作CustomCarouselPageRenderer
. 而是CarouselPageRenderer
像使用 iOS 一样使用 。
最后一件事是在Android上不能禁用 ViewPager 的滚动。要获得此行为,您可以侦听Touch事件。将TouchEventArgs的 Handled 属性设置为true将阻止滚动发生。
你的整个班级看起来像:
[assembly: ExportRenderer(typeof(CarouselPage), typeof(CustomCarouselPageRenderer))]
namespace StixApp.Droid.Renderers
{
public class CustomCarouselPageRenderer : CarouselPageRenderer
{
private bool _canScroll = false;
public CustomCarouselPageRenderer(Context context) : base(context)
{
}
public CustomCarouselPageRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
{
base.OnElementChanged(e);
if (this.ChildCount > 0 && this.GetChildAt(0) is ViewPager viewPager)
{
viewPager.Touch -= ViewPagerTouched;
viewPager.Touch += ViewPagerTouched;
}
}
private void ViewPagerTouched(object sender, TouchEventArgs e)
{
e.Handled = !_canScroll;
}
}
}
只需将_canScroll的值更改为 true 即可允许滚动。
希望这可以帮助。-
推荐阅读
- android - 如何在解析中搜索对象,如果匹配则放入android中的xml
- ios - SKPaymentTransactionObserver 的 updatedTransactions 委托方法中的事务状态何时设置为恢复?
- c# - 无法加载文件或程序集'NDde
- javascript - 无法设置未定义 js 的属性“显示”
- primefaces - 如何自定义 DefaultScheduleEvent 并在 PrimeFaces schedule 中创建我们自己的事件
- android - 如何在 MPAndroid 图表中动态设置 X 轴和 Y 轴的数据
- linux - Unix/Linux 显示平均文件大小有限制
- python - 倒排索引实现中的字符串索引超出范围
- javascript - 将数组中的对象数组添加到 JSON 中
- python - 在多类多输出问题上,我如何获得 f1 分数、精度和召回率?