Xamarin.Android ButtonRenderer longclick和touch

时间:2017-03-20 23:34:02

标签: xamarin xamarin.android xamarin.forms

我试图通过ButtonRender实现android按钮的功能。当我尝试加入" .LongClick"和" .touch",因为它没有启动长按事件。

 protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        {

        this.SetBackgroundResource(Resource.Drawable.button);

        base.OnElementChanged(e);
        Android.Widget.Button thisButton = Control as Android.Widget.Button;

        thisButton.LongClickable = true;


        thisButton.LongClick += delegate
        {
            string s = "";
        };



        thisButton.Touch += (object sender, Android.Views.View.TouchEventArgs e2) =>
        {

            if (e2.Event.Action == MotionEventActions.Down)
            {
               .
               .
               .
            }
            else if (e2.Event.Action == MotionEventActions.Up)
            {
               .
               .
               .
            }
            else if (e2.Event.Action == MotionEventActions.HoverExit || e2.Event.Action == MotionEventActions.Cancel)
            {
               .
               .
               .
            }
            else if (e2.Event.Action == MotionEventActions.Move)
            {
               .
               .
               .
             }

            };
  }

1 个答案:

答案 0 :(得分:4)

要调用本机控件事件,我们需要在自定义控件中创建事件处理程序,并在一起创建一个继承自IViewController的接口,以便从渲染器设置值。

这是我的演示,首先,创建一个自定义按钮:

public class MyButton : Xamarin.Forms.Button, IMyButtonController
{
    public event EventHandler Touched;

    void IMyButtonController.SendTouched()
    {
        Touched?.Invoke(this, EventArgs.Empty);
    }

    public event EventHandler LongClicked;

    void IMyButtonController.SendLongClicked()
    {
        LongClicked?.Invoke(this, EventArgs.Empty);
    }

    public event EventHandler Released;

    void IMyButtonController.SendReleased()
    {
        Released?.Invoke(this, EventArgs.Empty);
    }
}

IMyButtonController继承自IViewController,如下所示:

public interface IMyButtonController : IViewController
{
    void SendTouched();

    void SendLongClicked();

    void SendReleased();
}

然后在android项目中,像这样实现ButtonRendererIMyButtonController

[assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRenderer))]
namespace ProjectNameSpace.Droid
{
    public class MyButtonRenderer : Xamarin.Forms.Platform.Android.ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                if (Control != null)
                {
                    Control.SetOnTouchListener(ButtonTouchListener.Instance.Value);
                    Control.LongClickable = true;
                    Control.SetOnLongClickListener(ButtonLongClickListener.Instance.Value);
                }
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (Control != null)
                {
                    Control.SetOnTouchListener(null);
                    Control.SetOnLongClickListener(null);
                }
            }

            base.Dispose(disposing);
        }

        private class ButtonTouchListener : Java.Lang.Object, Android.Views.View.IOnTouchListener
        {
            public static readonly Lazy<ButtonTouchListener> Instance = new Lazy<ButtonTouchListener>(() => new ButtonTouchListener());

            public bool OnTouch(Android.Views.View v, Android.Views.MotionEvent e)
            {
                var renderer = v.Tag as ButtonRenderer;
                if (renderer != null)
                {
                    var buttonController = renderer.Element as IMyButtonController;
                    if (e.Action == Android.Views.MotionEventActions.Down)
                    {
                        buttonController?.SendTouched();
                    }
                    else if (e.Action == Android.Views.MotionEventActions.Up)
                    {
                        buttonController?.SendReleased();
                    }
                }
                return false;
            }
        }

        private class ButtonLongClickListener : Java.Lang.Object, Android.Views.View.IOnLongClickListener
        {
            public static readonly Lazy<ButtonLongClickListener> Instance = new Lazy<ButtonLongClickListener>(() => new ButtonLongClickListener());

            public bool OnLongClick(Android.Views.View v)
            {
                var renderer = v.Tag as ButtonRenderer;
                ((IMyButtonController)renderer?.Element)?.SendLongClicked();
                return true;
            }
        }
    }
}