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

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 }

然后分别编写各个平台自己的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 }

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 }

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 }

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

原文地址:https://www.cnblogs.com/devin_zhou/p/8414675.html

时间: 2024-10-04 13:22:36

Xamarin.Forms 监听Button的按下、释放事件的相关文章

Xamarin Android 监听音量键(下)

上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键.返回键.菜单键等)均可通过该按键事件被捕获. 但是,按键重写在 MainActivity 中,音量键按下时执行的方法在其他页面中. 作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上.如

【转】Android开发20——单个监听器监听多个按钮点击事件

原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://woshixy.blog.51cto.com/5637578/1093936 一.单个按钮点击事件的监听 方法一 /** * 从网络上获取图片 * * @author 徐越 * */ public class MainActivity extends Activity { pri

Qt Gui中父控件监听子控件的IO事件

父对象重新定义自己继承自QObject的函数bool eventFilter(QObject* watched, QEvent* event). 子控件安装父对象的eventFilter: 例如, QTableView * itsView = new QTableView; itsView->viewport()->installEventFilter(this); Qt Gui中父控件监听子控件的IO事件

Android监听Button和ImageButton控件的点击事件

一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都有onClick事件,不仅仅是Button和ImageButton才有 通过点击事件的监听可以实现点击按钮之后要发生什么动作 二.操作的基本步骤:  第一步:声明一个私有变量,用于存储获取到的控件对象 第二步:初始化当前需要的控件(找到需要操作的那个控件) 第三步:设置Button的监听器,通过监听

Netty事件监听和处理(下)

上一篇 介绍了事件监听.责任链模型.socket接口和IO模型.线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和处理. 前面提到,Netty是一个NIO框架,它将IO通道的建立.可读.可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理. 通过介绍,你会了解到: 事件监听和处理模型 事件监听:EventLoop 事件处理:ChannelPipeline和ChannelHandle

xamarin forms中的Button文本默认大写

问题来源 使用xamarin forms创建的android项目中,Button.Toolbar的右侧菜单按钮上的如果是字母的话,在android5.0以上,默认的文本都是大写,这种情况iOS项目不存在,是正常的显示.google公司把android的文本默认大写,这个肯定和英语国家阅读习惯有关,但是iOS却是正常显示,有点难以解释google为什么将android的按钮文本默认成大写.问题如图: 分析 其实这个问题的产生的原因还是因为 在5.0中在Button使用的Theme是这个,默认已经t

vs xamarin android 监听返回键退出程序

public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode.Back) { Finish(); System.Environment.Exit(0); } return base.OnKeyDown(keyCode, e); } 在activity中重写OnKeyDown监听.

监听Echarts 里的地图缩放事件

 // 获取百度地图实例,使用百度地图自带的控件     var bmap = myChart.getModel().getComponent('bmap').getBMap();     bmap.setMapStyle({style:'normal'});     bmap.addControl(new BMap.MapTypeControl());     bmap.addControl(new BMap.ScaleControl());      bmap.addControl(new 

监听JList列表项的单击事件

原文:http://blog.sina.com.cn/s/blog_5f1bfbd901015d5d.html 1 import java.awt.BorderLayout; 2 import java.awt.EventQueue; 3 import javax.swing.JFrame; 4 import javax.swing.JLabel; 5 import javax.swing.JList; 6 import javax.swing.JOptionPane; 7 import jav