Jump List on Android - 如何实现按住和滑动
Jump List on Android - how to achieve hold & swipe
我一直在关注此 post 以尝试了解 Android 如何具有与 iOS 跳转列表
类似的功能
Xamarin: Vertical alphabet Indexing (Jump List) for grouped list in Xamarin forms for Android and windows UWP
我在使用布局实现字母索引时没有遇到任何问题,而且还实现了 scrollto,因此当点击选择一个字母时,主列表将相应地运行
然而,一个关键的可用性差异是 iOS,上面示例中的字母非常小,旨在让用户只需在屏幕上按住拇指并上下移动
使用 Android,因为我们 'mimicking' 使用 ListView,所以您只有点击和选择
这两种方式都无法提供与用户必须在屏幕上和屏幕外抬起手指相同的流畅体验
有没有办法只在 Android 上扩展列表视图,这样用户就可以像 iOS 开箱即用一样,在字母列表中上下滑动并将事件发送到设备要处理?
ItemTapped="AlphaView_ItemTapped"
ItemSelected="AlphaView_ItemTapped"
您可以为列表视图自定义ListViewRenderer and SetOnTouchListener,然后可以检测按住和滑动方法。
例如示例渲染器代码如下:
[assembly: ExportRenderer(typeof(Xamarin.Forms.ListView), typeof(CustomListViewRenderer))]
namespace XamarinForms20.Droid
{
public class CustomListViewRenderer : ListViewRenderer, Android.Views.View.IOnTouchListener
{
Context _context;
public CustomListViewRenderer(Context context) : base(context)
{
_context = context;
}
static float mPosX = 0, mPosY = 0, mCurPosX = 0, mCurPosY = 0;
public bool OnTouch(Android.Views.View v, MotionEvent e)
{
// TODO Auto-generated method stub
int viewheight = v.Height;
switch (e.Action) {
case MotionEventActions.Down:
mPosX = e.GetX();
mPosY = e.GetY();
Console.WriteLine("Start on " + mPosY);
break;
case MotionEventActions.Move:
mCurPosX = e.GetX();
mCurPosY = e.GetY();
Console.WriteLine("Now is moving " + mCurPosY);
break;
case MotionEventActions.Up:
if (mCurPosY - mPosY > 0
&& (Math.Abs(mCurPosY - mPosY) > 25)) {
//scroll down
Console.WriteLine("scroll down to "+ mCurPosY/viewheight);
} else if (mCurPosY - mPosY< 0
&& (Math.Abs(mCurPosY - mPosY) > 25)) {
//scroll up
Console.WriteLine("scroll up to " + mCurPosY/viewheight);
}
break;
}
return true;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe
}
if (e.NewElement != null)
{
Control.SetOnTouchListener(this);
}
}
}
}
我一直在关注此 post 以尝试了解 Android 如何具有与 iOS 跳转列表
类似的功能Xamarin: Vertical alphabet Indexing (Jump List) for grouped list in Xamarin forms for Android and windows UWP
我在使用布局实现字母索引时没有遇到任何问题,而且还实现了 scrollto,因此当点击选择一个字母时,主列表将相应地运行
然而,一个关键的可用性差异是 iOS,上面示例中的字母非常小,旨在让用户只需在屏幕上按住拇指并上下移动
使用 Android,因为我们 'mimicking' 使用 ListView,所以您只有点击和选择
这两种方式都无法提供与用户必须在屏幕上和屏幕外抬起手指相同的流畅体验
有没有办法只在 Android 上扩展列表视图,这样用户就可以像 iOS 开箱即用一样,在字母列表中上下滑动并将事件发送到设备要处理?
ItemTapped="AlphaView_ItemTapped"
ItemSelected="AlphaView_ItemTapped"
您可以为列表视图自定义ListViewRenderer and SetOnTouchListener,然后可以检测按住和滑动方法。
例如示例渲染器代码如下:
[assembly: ExportRenderer(typeof(Xamarin.Forms.ListView), typeof(CustomListViewRenderer))]
namespace XamarinForms20.Droid
{
public class CustomListViewRenderer : ListViewRenderer, Android.Views.View.IOnTouchListener
{
Context _context;
public CustomListViewRenderer(Context context) : base(context)
{
_context = context;
}
static float mPosX = 0, mPosY = 0, mCurPosX = 0, mCurPosY = 0;
public bool OnTouch(Android.Views.View v, MotionEvent e)
{
// TODO Auto-generated method stub
int viewheight = v.Height;
switch (e.Action) {
case MotionEventActions.Down:
mPosX = e.GetX();
mPosY = e.GetY();
Console.WriteLine("Start on " + mPosY);
break;
case MotionEventActions.Move:
mCurPosX = e.GetX();
mCurPosY = e.GetY();
Console.WriteLine("Now is moving " + mCurPosY);
break;
case MotionEventActions.Up:
if (mCurPosY - mPosY > 0
&& (Math.Abs(mCurPosY - mPosY) > 25)) {
//scroll down
Console.WriteLine("scroll down to "+ mCurPosY/viewheight);
} else if (mCurPosY - mPosY< 0
&& (Math.Abs(mCurPosY - mPosY) > 25)) {
//scroll up
Console.WriteLine("scroll up to " + mCurPosY/viewheight);
}
break;
}
return true;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe
}
if (e.NewElement != null)
{
Control.SetOnTouchListener(this);
}
}
}
}