专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

Xamarin.Forms 监听Button的按下、释放事件

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:56:53       共计:3585 浏览

工作中遇到这样的一个需求,模仿微信发生语音功能,需要实现按钮按下开始录音,按钮释放录音结束,


Xamarin.Forms中Button没有这样的事件,那么我们如何实现对Button按下,释放两个事件的监听呢?


当然这里我们再次用到了CustomRenderer,一旦遇到Xamrin.Forms无法实现的某些功能,我们就可以


通过CustomRenderer来处理。


首先:我们自定义一个VoiceRecordButton继承于Button


1 using System;

2 using System.Collections.Generic;

3 using System.Diagnostics;

4 using System.Text;

5 using System.Windows.Input;

6 using Xamarin.Forms;

7

8 namespace XFPractice.CustomView

9 {

10     public class VoiceRecordButton: Button

11     {

12

13         public ICommand StartCommand { get; set; }

14         public ICommand EndCommand { get; set; }

15

16         public VoiceRecordButton()

17         {

18             StartCommand = new Command(()=> {

19                 Debug.WriteLine(" StartCommand =========== ");

20             });

21

22             EndCommand = new Command(() => {

23                 Debug.WriteLine(" EndCommand =========== ");

24             });

25         }

26

27     }

28 }


View Code




然后分别编写各个平台自己的VoiceRecordButtonRenderer:


Android:


通过IOnTouchListener来监听用户对Button的操作。


1 using Android.Views;

2 using XFPractice.CustomView;

3 using XFPractice.Droid.Renderers;

4 using Xamarin.Forms;

5 using Xamarin.Forms.Platform.Android;

6 using static Android.Views.View;

7

8 [assembly: ExportRenderer(typeof(VoiceRecordButton), typeof(VoiceRecordButtonRenderer))]

9 namespace XFPractice.Droid.Renderers

10 {

11     public class VoiceRecordButtonRenderer:ButtonRenderer,IOnTouchListener

12     {

13         VoiceRecordButton view;

14

15         public bool OnTouch(Android.Views.View v, MotionEvent e)

16         {

17             switch(e.Action)

18             {

19                 case MotionEventActions.Down:

20                     view?.StartCommand?.Execute("");

21                     break;

22                 case MotionEventActions.Up:

23                      view?.EndCommand?.Execute("");

24                     break;

25             }

26             return true;

27         }

28

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

30         {

31             base.OnElementChanged(e);

32

33             Control.SetOnTouchListener(this);

34

35             if (e.NewElement != null)

36                 view = e.NewElement as VoiceRecordButton;

37         }

38

39     }

40 }


View Code


iOS:


通过对TouchDown、TouchUpInside、TouchUpOutside三个事件的处理。


1 using System;

2 using System.Collections.Generic;

3 using System.Diagnostics;

4 using System.Linq;

5 using System.Text;

6

7 using Foundation;

8 using XFPractice.CustomView;

9 using XFPractice.iOS.Renderers;

10 using UIKit;

11 using Xamarin.Forms;

12 using Xamarin.Forms.Platform.iOS;

13

14 [assembly: ExportRenderer(typeof(VoiceRecordButton), typeof(VoiceRecordButtonRenderer))]

15 namespace XFPractice.iOS.Renderers

16 {

17     public class VoiceRecordButtonRenderer : ButtonRenderer

18     {

19         VoiceRecordButton view;

20

21         public VoiceRecordButtonRenderer()

22         {

23            

24         }

25

26

27         protected override void OnElementChanged(ElementChangedEventArgs<Button> e)

28         {

29             base.OnElementChanged(e);

30

31             if (e.NewElement != null)

32                 view = e.NewElement as VoiceRecordButton;

33             Control.TouchDown += Control_TouchDown;

34             Control.TouchUpInside += Control_TouchUpInside;

35             Control.TouchUpOutside += Control_TouchUpOutside;

36         }

37

38         private void Control_TouchUpOutside(object sender, EventArgs e)

39         {

40             view?.EndCommand?.Execute("");

41         }

42

43         private void Control_TouchUpInside(object sender, EventArgs e)

44         {

45             view?.EndCommand?.Execute("");

46         }

47

48         private void Control_TouchDown(object sender, EventArgs e)

49         {

50             view?.StartCommand?.Execute("");

51         }

52     }

53 }


View Code


UWP:


UWP有一个Holding事件,但是对鼠标无效,只对触摸有效,这里我们采用了PointerEventHandler来处理。


1 using XFPractice.CustomView;

2 using XFPractice.UWP.Renderers;

3 using System;

4 using System.Collections.Generic;

5 using System.Diagnostics;

6 using System.Linq;

7 using System.Text;

8 using System.Threading.Tasks;

9 using Windows.UI.Input;

10 using Windows.UI.Xaml.Input;

11 using Xamarin.Forms.Platform.UWP;

12

13 [assembly: ExportRenderer(typeof(VoiceRecordButton), typeof(VoiceRecordButtonRenderer))]

14 namespace XFPractice.UWP.Renderers

15 {

16     public class VoiceRecordButtonRenderer:ButtonRenderer

17     {

18         VoiceRecordButton view;

19

20

21         public VoiceRecordButtonRenderer()

22         {

23         }

24

25        

26

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

28         {

29             base.OnElementChanged(e);

30

31            

32             if (e.NewElement != null)

33             {

34                 view = e.NewElement as VoiceRecordButton;

35             }

36             Control.AddHandler(PointerReleasedEvent, new PointerEventHandler(Control_PointerReleased), true);

37             Control.AddHandler(PointerPressedEvent, new PointerEventHandler(Control_PointerPressed), true);

38         }

39

40         private void Control_PointerPressed(object sender, PointerRoutedEventArgs e)

41         {

42             view?.StartCommand?.Execute("");

43         }

44

45         private void Control_PointerReleased(object sender, PointerRoutedEventArgs e)

46         {

47             view?.EndCommand?.Execute("");

48         }

49

50        

51          }

52 }


View Code




这样我们就能监听Button的按下、和释放操作。

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C#中方向键与回车键切换控件焦点 | ·下一条:xamarin.Android自动升级

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有