第6章 Android 事件处理_第1页
第6章 Android 事件处理_第2页
第6章 Android 事件处理_第3页
第6章 Android 事件处理_第4页
第6章 Android 事件处理_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲教师:日期:第6章

Android事件处理Android程序设计目录/CONTENTS6.1基于监听的事件处理6.2基于回调的事件处理6.3响应系统设置的事件6.4Handler消息传递机制1.掌握监听事件处理流程及使用方式。2.了解回调函数机制。3.掌握系统响应事件的使用。学习目标4.掌握Handler消息传递机制。6.1基于监听的事件处理6.1.1事件监听的处理模型事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等。EventSource(事件源)事件封装了界面组件上发生的特定事情(通常是一次用户操作)。如果程序需要获得界面组件上所发生事件的相关信息,一般通过Event对象来取得。Event(事件)负责监听事件源所发生的事件,并对各种事件做出相应的响应。EventListener(事件监听器)在事件监听的处理模型中,主要涉及如下三类对象:6.1基于监听的事件处理监听机制常用监听接口如下。(1)View.OnClickListener:单击事件监听器必须实现的接口。(2)View.OnCreateContextMenuListener:创建上下文菜单事件。(3)View.OnFocusChangeListener:焦点改变事件。(4)View.OnKeyListener:按键事件监听器。(5)View.OnLongClickListener:长按事件监听器。(6)View.OnTouchListener:触摸屏事件监听器。6.1基于监听的事件处理【例6-1】监听的事件处理模型示例。布局代码如下:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:gravity="center_horizontal"><EditTextandroid:id="@+id/txt"android:layout_width="fill_parent"android:layout_height="wrap_content"android:cursorVisible="false"android:textSize="12pt"></EditText><!--定义一个按钮,该按钮将作为事件源--><Buttonandroid:id="@+id/bn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="单击我试试"/></LinearLayout>6.1基于监听的事件处理Java代码如下:publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取应用程序中的bn按钮Buttonbn=(Button)findViewById(R.id.bn);//为该按钮绑定事件监听器bn.setOnClickListener(newMyClickListener());}//定义一个单击事件的监听器classMyClickListenerimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){EditTexttext=(EditText)findViewById(R.id.txt);text.setText("按钮被单击了!");}}}6.1基于监听的事件处理运行结果如图6-2所示。6.1基于监听的事件处理6.1.2 创建监听器的方法ABCD在XML文件中“显示指定按钮的onClick属性”匿名内部类作为事件监听器自身类作为事件监听器BCDA核心代码如下:内部类作为事件监听器btnButton.setOnClickListener(newMyListener());classMyListenerimplementsOnClickListener{publicvoidonClick(Viewv){System.out.println("内部类响应单击事件");}}核心代码如下:<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onClick"android:text="Button1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onClick"android:text="Button2"/>核心代码如下:btnButton.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){System.out.println("匿名内部类响应按钮单击事件");}});核心代码如下:publicclassButtonActivityextendsActivityimplementsOnClickListener{Buttonbtn1,btn2;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_button);btn1=(Button)findViewById(R.id.button1);btn2=(Button)findViewById(R.id.button2);btn1.setOnClickListener(this);btn2.setOnClickListener(this);}}6.1基于监听的事件处理在XML文件中“显示指定按钮的onClick属性”D核心Java代码如下:publicclassTestButtonActivityextendsActivity{Buttonbtn1,btn2;Toasttst;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_button);}publicvoidonClick(Viewv){switch(v.getId()){caseR.id.button1:tst=Toast.makeText(this,"111111111",Toast.LENGTH_SHORT);tst.show();break;caseR.id.button2:tst=Toast.makeText(this,"222222222",Toast.LENGTH_SHORT);tst.show();break;}}}6.1基于监听的事件处理6.1.3 在标签中绑定事件处理器【例6-2】在标签中绑定事件处理器的实现过程。布局代码如下:<RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="测试"android:id="@+id/textView"android:textSize="32dp"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="单击我试试"android:id="@+id/button"android:onClick="clickButton"/></LinearLayout></RelativeLayout>6.1基于监听的事件处理Java代码如下:publicclassMainActivityextendsAppCompatActivity{TextViewtView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*实现clickButton方法*/publicvoidclickButton(Viewview){tView=(TextView)findViewById(R.id.textView);tView.setText("按钮被单击了");}}6.1基于监听的事件处理运行结果如图6-3所示。6.2基于回调的事件处理6.2.1 回调机制21自定义View类继承自需要的ViewUI类。例如,自定义MyButton按钮类extends基础Button类。回调事件应用步骤复写回调函数例如“publicbooleanonTouchEvent(MotionEventevent)”。每一个事件回调方法都会返回一个boolean值。如果返回true,表示该事件已被处理,不再继续向外扩散;如果返回false,表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,例如Activity中的回调方法。6.2基于回调的事件处理【例6-3】回调事件示例,代码如下:#定义接口publicinterfaceOnClickListener{publicvoidOnClick(Buttonb);}#定义ButtonpublicclassButton{OnClickListenerlistener;publicvoidclick(){listener.OnClick(this);}publicvoidsetOnClickListener(OnClickListenerlistener){this.listener=listener;}}#将接口对象OnClickListener赋给Button的接口成员publicclassActivity{publicActivity(){}publicstaticvoidmain(String[]args){Buttonbutton=newButton();button.setOnClickListener(newOnClickListener(){@OverridepublicvoidOnClick(Buttonb){System.out.println("clicked");}});button.click();}}6.2基于回调的事件处理6.2.2 基于回调的事件处理机制1.自定义View常见View组件的回调方法如下:(1)在该组件上触发屏幕事件:booleanonTouchEvent(MotionEventevent);(2)在该组件上按下某个按钮时:booleanonKeyDown(intkeyCode,KeyEventevent);(3)松开组件上的某个按钮时:booleanonKeyUp(intkeyCode,KeyEventevent);(4)长按组件某个按钮时:booleanonKeyLongPress(intkeyCode,KeyEventevent);(5)键盘快捷键事件发生:booleanonKeyShortcut(intkeyCode,KeyEventevent);(6)在组件上触发轨迹球屏事件:booleanonTrackballEvent(MotionEventevent);(7)当组件的焦点发生改变(和前面的6个不同,这个方法只能够在View中重写):protectedvoidonFocusChanged(booleangainFocus,intdirection,RectpreviouslyFocusedRect);6.2基于回调的事件处理2.基于回调的事件传播6.3响应系统设置的事件6.3.1 Configuration类Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设置配置。(1)publicfloatfontScale:获取当前用户设置的字体的缩放因子。(2)publicintkeyboard:获取当前设备所关联的键盘类型。(3)publicintkeyboardHidden:该属性返回一个boolean值用于标识当前键盘是否可用。该属性不仅会判断系统的硬键盘,也会判断系统的软键盘(位于屏幕上)。(4)publicLocalelocale:获取用户当前的Locale。(5)publicintmcc:获取移动信号的国家码。(6)publicintmnc:获取移动信号的网络码。(7)publicintnavigation:判断系统上方向导航设备的类型。(8)publicintorientation:获取系统屏幕的方向。(9)publicinttouchscreen:获取系统触摸屏的触摸方式。6.3响应系统设置的事件【例6-4】Configuration用法示例,该程序可以获取系统的屏幕方向、触摸屏方式等。布局代码如下:<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:id="@+id/ori"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/navigation"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/touch"android:layout_width="match_parent"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/mnc"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/bn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="获取系统设备状态"/></LinearLayout>6.3响应系统设置的事件Java代码如下:publicclassMainActivityextendsActivity{EditTextori;EditTextnavigation;EditTexttouch;EditTextmnc;Buttonbn;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ori=(EditText)findViewById(R.id.ori);navigation=(EditText)findViewById(R.id.navigation);touch=(EditText)findViewById(R.id.touch);mnc=(EditText)findViewById(R.id.mnc);Buttonbn=(Button)findViewById(R.id.bn);bn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Configurationcfg=getResources().getConfiguration();Stringscreen=cfg.orientation==Configuration.ORIENTATION_LANDSCAPE?"横向屏幕":"竖向屏幕";StringmncCode=cfg.mnc+"";StringnaviName=cfg.orientation==Configuration.NAVIGATION_NONAV?"没有方向控制":cfg.orientation==Configuration.NAVIGATION_WHEEL?"滚轮控制方向":cfg.orientation==Configuration.NAVIGATION_DPAD?"方向键控制方向":"轨迹球控制方向";navigation.setText(naviName);StringtouchName=cfg.touchscreen==Configuration.TOUCHSCREEN_NOTOUCH?"无触摸屏":"支持触摸屏";ori.setText(screen);mnc.setText(mncCode);touch.setText(touchName);}});}}6.3响应系统设置的事件运行结果如图6-4所示。6.3响应系统设置的事件6.3.2 onConfigurationChanged方法使用onConfiguration方法大致分成两步:(1)在Manifest文件中对Activity注册的地方加入android:onConfigurationChanged:其后有若干个选项,可以根据需要选择。(2)在继承自Activity的类里回调一个函数onConfiguration(),在函数里写好回调的方法。6.3响应系统设置的事件【例6-5】onConfigurationChanged方法的实现过程。布局代码如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="更改屏幕方向"/></LinearLayout>6.3响应系统设置的事件Java文件如下:publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获得改变系统布局的按钮Buttonbtn=(Button)findViewById(R.id.btn1);btn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Configurationconfig=getResources().getConfiguration();if(config.orientation==Configuration.ORIENTATION_LANDSCAPE){//设为竖屏MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}//如果当前是竖屏if(config.orientation==Configuration.ORIENTATION_PORTRAIT){//设为横屏MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}}});}//重写该方法,用于监听系统设置的更改,主要是监控屏幕方向的更改@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);Stringscreen=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE?"横屏":"竖屏";Toast.makeText(this,"系统屏幕方向发生改变"+"\n修改后的屏幕方向为:"+screen,Toast.LENGTH_LONG).show();}}6.3响应系统设置的事件运行结果如图6-5所示。6.4Handler消息传递机制6.4.1 Handler类Handler类发送、处理消息的方法如下:(1)handleMessage(Messagemsg):处理消息的方法。该方法通常用于被重写。(2)hasMessages(intwhat):检查消息队列中是否包含what属性为指定值的消息。(3)hasMessages(intwhat,Objectobject):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。(4)sendEmptyMessage(intwhat):发送空消息。(5)sendEmptyMessageDelayed(intwhat,longdelayMillis):指定多少毫秒之后发送空消息。(6)sendMessage(Messagemsg):立即发送消息。(7)sendMessageDelayed(Messagemsg,longdelayMillis):指定多少毫秒之后发送消息。6.3响应系统设置的事件【例6-6】模拟一个简单的相册查看器,每隔2秒自动更换下一张照片。布局代码如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"><ImageViewandroid:id="@+id/imageView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:src="@drawable/p1"android:gravity="center"/></LinearLayout>6.3响应系统设置的事件Java代码如下:publicclassMainActivityextendsActivity{privateImageViewimageView=null;privateHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){case0:imageView.setImageResource(R.drawable.p1);break;case1:imageView.setImageResource(R.drawable.p2);break;case2:imageView.setImageResource(R.drawable.p3);break;case3:imageView.setImageResource(R.drawable.p4);break;}super.handleMessage(msg);}}@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView=(ImageView)findViewById(R.id.imageView);thread.start();}intwhat=0;Threadthread=newThread(newRunnable(){publicvoidrun(){while(true){handler.sendEmptyMessage((what++)%4);try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}}}});}6.3响应系统设置的事件运行结果如图6-6所示。6.4Handler消息传递机制6.4.2 消息传递机制1.Handler、Looper及MessageQueue三者的关系Handler负责消息的封装,和读取消息:new一个looper对象会在构造方法中调用new一个MessageQueue,然后循环读取MessageQueue里的Message,如果消息不为null,则交给Handler处理。负责发送消息和接收消息:new一个Handler对象会在构造方法中调用Looper.myLooper方法获取一个Looper对象,然后从Looper对象获取到MessageQueue对象,Handler将要发送的Message存放到MessageQueue,looper循环获取MessageQueue里的消息,如果消息不为null,则交给Message的tar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论