public interface OnLongClickListener { boolean onLongClick(VIEw v); } public interface OnLongClickListener { boolean onLongClick(VIEw v);}@H_404_0@ VIEw类中的OnLongClickListener监听器定义如下:(需要传递事件MotionEvent)
public interface OntouchListener { boolean ontouch(VIEw v,MotionEvent event); } public interface OntouchListener { boolean ontouch(VIEw v,MotionEvent event);}@H_404_0@二 基于回调的事件处理@H_404_0@相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写OverrIDe组件类的事件处理函数实现事件的处理。@H_404_0@ 举例:@H_404_0@VIEw类实现了KeyEvent.Callback接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义view来实现,自定义view时重写这些事件处理方法即可。
public interface Callback { // 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于 // 标识该处理函数是否能完全处理该事件 // 返回true,表明该函数已完全处理该事件,该事件不会传播出去 // 返回false,表明该函数未完全处理该事件,该事件会传播出去 boolean onKeyDown(int keyCode,KeyEvent event); boolean onKeyLongPress(int keyCode,KeyEvent event); boolean onKeyUp(int keyCode,KeyEvent event); boolean onKeyMultiple(int keyCode,int count,KeyEvent event); } public interface Callback { // 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于 // 标识该处理函数是否能完全处理该事件// 返回true,表明该函数已完全处理该事件,该事件不会传播出去// 返回false,表明该函数未完全处理该事件,该事件会传播出去 boolean onKeyDown(int keyCode,KeyEvent event); boolean onKeyLongPress(int keyCode,KeyEvent event); boolean onKeyUp(int keyCode,KeyEvent event); boolean onKeyMultiple(int keyCode,KeyEvent event);}@H_404_0@三、比对@H_404_0@基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现;@H_404_0@AndroID的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发;@H_404_0@某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。@H_404_0@四、基于自定义监听器的事件处理流程@H_404_0@在实际项目开发中,我们经常需要自定义监听器来实现自定义业务流程的处理,而且一般都不是基于GUI界面作为事件源的。这里以常见的app自动更新为例进行说明,在自动更新过程中,会存在两个状态:下载中和下载完成,而我们的程序需要在这两个状态做不同的事情,“下载中”需要在UI界面上实时显示软件包下载的进度,“下载完成”后,取消进度条的显示。这里进行一个模拟,重点在说明自定义监听器的事件处理流程。@H_404_0@4.1)定义事件监听器如下:
public interface DownloadListener{ public voID onDownloading(int porgress);//下载过程中的处理函数 public voID onDownload();//下载完成的处理函数}@H_404_0@4.2)实现下载 *** 作的工具类代码如下:
public class DownloadUtils{ private static DownloadUtils instance=null; private private(){ } public static synchronized DownloadUtils instance(){ if(instance==null){ instance=new DownloadUtils(); } returns instance; } }private boolean is Downloading=ture;private int progress=0;//实际开发中这个函数需要传人url作为参数,以获取服务器端安装包位置public voID download(DownloadListener Listener)throws interruptdeException{while (isDownloading){ Listener.onDownloading(progress); //下载过程的简单模拟 Thread.sleep(1000); progress+=10; if(progress>=100){ isDownloading=false; }}//下载完成Listener.onDownload();}}@H_404_0@4.3)最后在main函数中模拟事件源:
public class DownloadUI{ public static voID main(sting[] args){ try{ DownloadUtils.instance().download(new MyDownloadListener()); }catch(InterruptedExceptiob e){ e.printstacktrace(); } } private static class MyDownloadListener implements DownloadListener{ @OverrIDepublic voID onDownloading(int progress){system.out.println("下载进度是:"+progress);} @OverrIDepublic voID onDownloaded(){system.out.println("下载完成")} }}@H_404_0@运行一下的模拟程序,输入如下所示:
@H_404_0@以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 总结
以上是内存溢出为你收集整理的详解Android的两种事件处理机制全部内容,希望文章能够帮你解决详解Android的两种事件处理机制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)