一,基于监听的事件处理
委托式的事件处理,即将事件处理交给事件监听器.为界面组件绑定特定的事件监听器
优势:分工明确,维护性好. 保证监听事件会被优先触发
| Event Source 事件源 任意界面组件都可作为事件源
| Event 事件 无需关心,由系统产生
| Event Listener 事件监听器 事件处理的核心,需要编写事件处理代码
| Activity 本身作为事件监听器(实现监听器接口)
缺点:程序结构混乱,容易引起混淆
| 外部类作为事件监听器类
缺点:不利于提高程序的内聚性,不能自由访问GUI界面的类中的组件,编程不够简洁 优点:多个GUI界面共享
| 匿名内部类作为事件监听器类
缺点:语法不容易掌握,代码重用性差. 优点:逻辑清晰,使用广泛
| 直接保定标签 android:onClick="clickButton"
二,基于回调的事件处理
事件源与事件监听器是统一的.
重写Android组件的特定回调方法,可用于处理一些具有通用性的事件,基于回调的事件处理代码会比较简洁.但某些特定的事件无法使用.
| onKeyDown(int keyCode,KeyEvent event) 在某个组件上按下某个按钮触发
| onKeyLongPress(int keyCode,KeyEvent event) 在某个组件上长按某个按键触发
| onKeyShortcutint keyCode,KeyEvent event) 当一个键盘快捷键事件发生时触发
| onKeyUp(int keyCode,KeyEvent event) 在某个组件上松开某个按钮触发
| onTouchEvent(int keyCode,KeyEvent event) 在某个组件上触发触摸屏事件触时触发
| onTrackballEvent(int keyCode,KeyEvent event) 在某个组件上触发轨迹球屏幕事件时触发
基于回调事件的处理方法都有一个boolean返回值,标识改方法是否能够完全处理该事件.如果是false,表示不能完全处理,该事件会被传播
三,响应系统设置的事件
Configuration 用于描述手机设备上的配置信息,包含用户特定的配置项也包含系统的动态设备配置.
| Configuration cfg = getResources().getConfiguration(); 获取Configuration对象
| public float fontScale 获取当前用户设置的字体的缩放因子
| public int keyboard 获取当前设备所关联的键盘类型(KEYBOARD_NOKEYS,KEYBOARD_QWERTY( 普通电脑键盘),KEYBOARD_12KEYS(只有12个键的小键盘))
| public Locale locale 获取当前用户的Locale
| public int mcc 获取移动信号的国家码
| public int mnc 获取移动信号的网路码
| public int navigation 判断系统上方导航设备的类型(NAVIGATION_NONAV(无导航),NAVIGATION_DPAD(DPAD导航),NAVIGATION_TRACKBALL(轨迹球导航), NAVIGATION_WHEEL(滚轮导航))
| public int orientation 获取系统屏幕的方向(ORIENTATION_LANDSCAPE(横向屏幕),ORIENTATION_PORTRAIT(竖向屏幕),ORIENTATION_SQUARE(方形屏幕))
| public int touchscreen 获取系统触摸屏的触摸方式(TOUCHSCREEN_NOTOUCH(无触摸),TOUCHSCREEN_STYLUS(触摸笔式的触摸),TOUCHSCREEN_FINGER(接受手指的触摸))
|
| 重写onConfigurationChanged 响应系统设置更改
需设置Activity相关监听事件,例如:监听屏幕改变事件;<activity android:configchanges="orientation" .../>
四,Handler 消息传递机制
出于性能考虑,Android 的UI操作并不是线程安全的,所以Android的UI线程只允许修改Activity的UI组件.修改UI的属性值需要借助Handler的消息传递机制来实现
| 使用步骤 1,在启动的线程中发送消息, 2,在主线程中获取并处理消息
| final boolean handleMessage(Message msg) 处理消息的方法,一般用于被重写
| final boolean hasMesssages(int what) 检查消息队列中是否包含what属性为属性为指定值的消息
| final boolean hasMesssages(int what,Object obj) 检查消息队列中是否包含what属性为指定值且obj属性为指定对象的消息
| 多个重载的 Message obtainMessage()获取消息
| sendEmptyMessage() 发送空消息
| final boolean sendEmptyMessageDelayed(int what,long delayMillis) 指定多少毫秒之后发送空消息
| final boolean sendMessage(Message msg) 立即发送消息
| final boolean sendMessageDelayed(Message msg,long delayMillis) 指定多少毫秒之后发送消息
| Message Handler接收和处理的消息对象
| Looper 每个线程只能有一个Looper,负责读取MessageQueue中的消息.读取后交给发送消息的Handler处理
| MessageQueue 消息队列(先进先出)
程序使用Handler传递处理消息,消息必须被发送到指定的MessageQueue,由于MessageQueue是由Looper管理的. 如果希望Handler正常工作,必须保证当前线程中有一个Looper对象
| 当前UI线程中已经初始化了一个Looper对象
| 程序员自己启动的子线程,必须自己创建一个Looper对象,并启动它 Looper.prepare();创建 Looper.loop();启动
五,异步任务 AsyncTask
AsyncTask<Params,Progress,Result> 抽象类,
| Params 启动任务执行的输出参数类型,Progress后台的任务完成的进度值的类型,Result后台执行的任务完成后返回结果的类型
| dolnBackground(Params...):后台线程将要完成的任务.该方法可以调用publishProgress(Progress... values) 方法更新任务的执行进度
| onProgressUpdate(Progress... values) 在olnBackground(Params...)方法中调用publishProgress()方法更新任务进度后将会触发此方法
| onPreExecute() 执行后台耗时操作前被调用.通是是完成一些初始化的操作
| onPostExecute(Result,result) 当dolnBackground()完成后,会自动调用该方法,并将dolnBackground()的返回值传递给该方法.
调用AsyncTask子类的实例的execute(Params... pro)开始执行耗时任务
| 必须在UI线程中创建AsyncTask实例
| 必须在UI线程中调用AsyncTask的execute方法
| 以上方法(dolnBackground,onProgressUpdate...)有Android系统负责声明调用
| 每个AsyncTask只能被执行一次,多次调用会引发异常
六.手势
| GestureDetector 手势检测器 创建该实例需要传递一个GestureDetector.OnGestureListener实例
| GestureDetector.OnGestureListener
| boolean onDown(MotionEvent e) 当触碰事件按下时触发该方法
| boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) 当用户在触碰上拖过时触发该方法, velocityX,velocityY代表拖过动作在横 向纵向上的速度
| abstract void onLongPress(MotionEvent e) 当用户在屏幕上长按时触发该方法
| boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY) 当用户在触屏上滚动时触发该方法
| void onShowPress(MotionEvent e) 当用户在触屏上按下而且还未移动和松开时触发该方法
| boolean onSiongleTapUp(MotionEvent e) 用户在触屏上轻击事件将触发该方法
| GestureLibrarys 工具类,创建手势库
| static GestureLibrary fromFile(String path) 从path代表的文件中加载手势库
| static GestureLibrary fromFile(File path) 从path代表的文件中加载手势库
| static GestureLibrary fromPrivateFile(Context context,String name) 从指定应用程序的数据文件夹中name文件中加载手势
| static GestureLibrary fromRawResource(Context context,int resourceId) 从resourceId所代表的资源中加载手势
| void addGesture(String entryName,Gesture gesture) 添加一个名为entryName的手势
| Set<Stirng> getGesturesEntries() 获取该手势库中所有的手势名称
| ArrayList<Gesture> getGestures(String entryName) 获取entryName对应的所有手势
| ArrayList<Prediction> recognize(Gesture gesture) 从当前手势库中识别与gesture匹配的全部手势
| void removeEntry(String entryName) 删除手势库中entryName对应的手势
| void removeGesture(String entryName,Gesture gesture) 删除手势库中 entryName,gesture对应的手势
| boolean save() 向手势库中添加或者删除手势后调用该方法保存手势库
| GestureOverlayView 绘制手势组件
| 手势监听器
| OnGestureListener
| OnGesturePerformedListener
| OnGesturingListener
七,自动朗读TTS
| TextToSpeech(Context context,TextToSpeech.OnlnitListener listener) 构造器
| setLanguage(Locale loc) 如过返回值是"TextToSpeech.LANG_GOUNTRY_AVAILABLE" 说明TTS可以支持所有的设置的语言,国家选项
| speak(String text,int queueMode,HashMap<Stirng,String> params)把文文字转化成音频,播放转换后的音频
| queueMode TextToSpeech.QUEUE_FLUSH 调用speak方法时会中断当前实例正在运行的任务
| queueMode TextToSpeech.QUEUE_ADD 调用speak方法会把发音任务添加到当前发音任务之后
| synthesizeToFile(String text,HashMap<String,String> params,String filename) 把文字转化成音频,并把音频保存成文件\
委托式的事件处理,即将事件处理交给事件监听器.为界面组件绑定特定的事件监听器
优势:分工明确,维护性好. 保证监听事件会被优先触发
| Event Source 事件源 任意界面组件都可作为事件源
| Event 事件 无需关心,由系统产生
| Event Listener 事件监听器 事件处理的核心,需要编写事件处理代码
| Activity 本身作为事件监听器(实现监听器接口)
缺点:程序结构混乱,容易引起混淆
| 外部类作为事件监听器类
缺点:不利于提高程序的内聚性,不能自由访问GUI界面的类中的组件,编程不够简洁 优点:多个GUI界面共享
| 匿名内部类作为事件监听器类
缺点:语法不容易掌握,代码重用性差. 优点:逻辑清晰,使用广泛
| 直接保定标签 android:onClick="clickButton"
二,基于回调的事件处理
事件源与事件监听器是统一的.
重写Android组件的特定回调方法,可用于处理一些具有通用性的事件,基于回调的事件处理代码会比较简洁.但某些特定的事件无法使用.
| onKeyDown(int keyCode,KeyEvent event) 在某个组件上按下某个按钮触发
| onKeyLongPress(int keyCode,KeyEvent event) 在某个组件上长按某个按键触发
| onKeyShortcutint keyCode,KeyEvent event) 当一个键盘快捷键事件发生时触发
| onKeyUp(int keyCode,KeyEvent event) 在某个组件上松开某个按钮触发
| onTouchEvent(int keyCode,KeyEvent event) 在某个组件上触发触摸屏事件触时触发
| onTrackballEvent(int keyCode,KeyEvent event) 在某个组件上触发轨迹球屏幕事件时触发
基于回调事件的处理方法都有一个boolean返回值,标识改方法是否能够完全处理该事件.如果是false,表示不能完全处理,该事件会被传播
三,响应系统设置的事件
Configuration 用于描述手机设备上的配置信息,包含用户特定的配置项也包含系统的动态设备配置.
| Configuration cfg = getResources().getConfiguration(); 获取Configuration对象
| public float fontScale 获取当前用户设置的字体的缩放因子
| public int keyboard 获取当前设备所关联的键盘类型(KEYBOARD_NOKEYS,KEYBOARD_QWERTY( 普通电脑键盘),KEYBOARD_12KEYS(只有12个键的小键盘))
| public Locale locale 获取当前用户的Locale
| public int mcc 获取移动信号的国家码
| public int mnc 获取移动信号的网路码
| public int navigation 判断系统上方导航设备的类型(NAVIGATION_NONAV(无导航),NAVIGATION_DPAD(DPAD导航),NAVIGATION_TRACKBALL(轨迹球导航), NAVIGATION_WHEEL(滚轮导航))
| public int orientation 获取系统屏幕的方向(ORIENTATION_LANDSCAPE(横向屏幕),ORIENTATION_PORTRAIT(竖向屏幕),ORIENTATION_SQUARE(方形屏幕))
| public int touchscreen 获取系统触摸屏的触摸方式(TOUCHSCREEN_NOTOUCH(无触摸),TOUCHSCREEN_STYLUS(触摸笔式的触摸),TOUCHSCREEN_FINGER(接受手指的触摸))
|
| 重写onConfigurationChanged 响应系统设置更改
需设置Activity相关监听事件,例如:监听屏幕改变事件;<activity android:configchanges="orientation" .../>
四,Handler 消息传递机制
出于性能考虑,Android 的UI操作并不是线程安全的,所以Android的UI线程只允许修改Activity的UI组件.修改UI的属性值需要借助Handler的消息传递机制来实现
| 使用步骤 1,在启动的线程中发送消息, 2,在主线程中获取并处理消息
| final boolean handleMessage(Message msg) 处理消息的方法,一般用于被重写
| final boolean hasMesssages(int what) 检查消息队列中是否包含what属性为属性为指定值的消息
| final boolean hasMesssages(int what,Object obj) 检查消息队列中是否包含what属性为指定值且obj属性为指定对象的消息
| 多个重载的 Message obtainMessage()获取消息
| sendEmptyMessage() 发送空消息
| final boolean sendEmptyMessageDelayed(int what,long delayMillis) 指定多少毫秒之后发送空消息
| final boolean sendMessage(Message msg) 立即发送消息
| final boolean sendMessageDelayed(Message msg,long delayMillis) 指定多少毫秒之后发送消息
| Message Handler接收和处理的消息对象
| Looper 每个线程只能有一个Looper,负责读取MessageQueue中的消息.读取后交给发送消息的Handler处理
| MessageQueue 消息队列(先进先出)
程序使用Handler传递处理消息,消息必须被发送到指定的MessageQueue,由于MessageQueue是由Looper管理的. 如果希望Handler正常工作,必须保证当前线程中有一个Looper对象
| 当前UI线程中已经初始化了一个Looper对象
| 程序员自己启动的子线程,必须自己创建一个Looper对象,并启动它 Looper.prepare();创建 Looper.loop();启动
五,异步任务 AsyncTask
AsyncTask<Params,Progress,Result> 抽象类,
| Params 启动任务执行的输出参数类型,Progress后台的任务完成的进度值的类型,Result后台执行的任务完成后返回结果的类型
| dolnBackground(Params...):后台线程将要完成的任务.该方法可以调用publishProgress(Progress... values) 方法更新任务的执行进度
| onProgressUpdate(Progress... values) 在olnBackground(Params...)方法中调用publishProgress()方法更新任务进度后将会触发此方法
| onPreExecute() 执行后台耗时操作前被调用.通是是完成一些初始化的操作
| onPostExecute(Result,result) 当dolnBackground()完成后,会自动调用该方法,并将dolnBackground()的返回值传递给该方法.
调用AsyncTask子类的实例的execute(Params... pro)开始执行耗时任务
| 必须在UI线程中创建AsyncTask实例
| 必须在UI线程中调用AsyncTask的execute方法
| 以上方法(dolnBackground,onProgressUpdate...)有Android系统负责声明调用
| 每个AsyncTask只能被执行一次,多次调用会引发异常
六.手势
| GestureDetector 手势检测器 创建该实例需要传递一个GestureDetector.OnGestureListener实例
| GestureDetector.OnGestureListener
| boolean onDown(MotionEvent e) 当触碰事件按下时触发该方法
| boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) 当用户在触碰上拖过时触发该方法, velocityX,velocityY代表拖过动作在横 向纵向上的速度
| abstract void onLongPress(MotionEvent e) 当用户在屏幕上长按时触发该方法
| boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY) 当用户在触屏上滚动时触发该方法
| void onShowPress(MotionEvent e) 当用户在触屏上按下而且还未移动和松开时触发该方法
| boolean onSiongleTapUp(MotionEvent e) 用户在触屏上轻击事件将触发该方法
| GestureLibrarys 工具类,创建手势库
| static GestureLibrary fromFile(String path) 从path代表的文件中加载手势库
| static GestureLibrary fromFile(File path) 从path代表的文件中加载手势库
| static GestureLibrary fromPrivateFile(Context context,String name) 从指定应用程序的数据文件夹中name文件中加载手势
| static GestureLibrary fromRawResource(Context context,int resourceId) 从resourceId所代表的资源中加载手势
| void addGesture(String entryName,Gesture gesture) 添加一个名为entryName的手势
| Set<Stirng> getGesturesEntries() 获取该手势库中所有的手势名称
| ArrayList<Gesture> getGestures(String entryName) 获取entryName对应的所有手势
| ArrayList<Prediction> recognize(Gesture gesture) 从当前手势库中识别与gesture匹配的全部手势
| void removeEntry(String entryName) 删除手势库中entryName对应的手势
| void removeGesture(String entryName,Gesture gesture) 删除手势库中 entryName,gesture对应的手势
| boolean save() 向手势库中添加或者删除手势后调用该方法保存手势库
| GestureOverlayView 绘制手势组件
| 手势监听器
| OnGestureListener
| OnGesturePerformedListener
| OnGesturingListener
七,自动朗读TTS
| TextToSpeech(Context context,TextToSpeech.OnlnitListener listener) 构造器
| setLanguage(Locale loc) 如过返回值是"TextToSpeech.LANG_GOUNTRY_AVAILABLE" 说明TTS可以支持所有的设置的语言,国家选项
| speak(String text,int queueMode,HashMap<Stirng,String> params)把文文字转化成音频,播放转换后的音频
| queueMode TextToSpeech.QUEUE_FLUSH 调用speak方法时会中断当前实例正在运行的任务
| queueMode TextToSpeech.QUEUE_ADD 调用speak方法会把发音任务添加到当前发音任务之后
| synthesizeToFile(String text,HashMap<String,String> params,String filename) 把文字转化成音频,并把音频保存成文件\