1. 程式人生 > >Xamarin.Forms 監聽Button的按下、釋放事件

Xamarin.Forms 監聽Button的按下、釋放事件

pre generic ews sed nth lose con isp 技術

Xamarin.Forms 監聽Button的按下、釋放事件

工作中遇到這樣的一個需求,模仿微信發生語音功能,需要實現按鈕按下開始錄音,按鈕釋放錄音結束,

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的按下、和釋放操作。

Xamarin.Forms 監聽Button的按下、釋放事件