Android事件处理通常和控件相结合,通常有以下几种事件处理模型:
- (一)事件监听的处理模型
public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bn =(Button)findViewById(R.id.bn); bn.setOnClickListener( newMyClickListener() ); } class MyClickListenerimplements View.OnClickListener { @override public void onClick(View arg0) { EditText txt =(EditText)findViewById(R.id.txt); Txt.setText(“bn 被单击了!”); } }
基于监听的事件处理模型步骤如下:
- 获取组件(事件源),也就是被监听的对象
- 实现事件监听器类,该类是一个特殊的Java类,必须实现一个XxxListener接口
- 调用事件源的setXxxListener方法将事件监听器对象注册给事件源
- (二)基于回调的事件处理
为了实现回调机制的事件处理,Android为所有GUI组件提供了一些事件处理方法,以View为例,该类包含如下方法
- boolean onKeyDown(int keyCode, KeyEvent event)
- boolean onKeyLongPress(int keyCode, KeyEvent event)
- boolean onKeyShortCut(int keyCode, KeyEvent event)
- boolean onKeyUp(int keyCode, KeyEvent event)
- boolean onTouchEvent(MotionEvent event)
- boolean onTrackballEvent(MotionEvent event)
所有基于回调的处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件
- 如果返回true,表明该处理方法已完全处理该事件,该事件不会传播出去
- 如果返回false,表明该处理方法并未完全处理该事件,该事件会传播出去
- (三)响应的系统设置的事件
程序可调用Activity的如下方法获取系统的Configuration对象:
Configuration cfg = getResources().getConfiguration();
一旦获得了系统的Configuration对象,便可获得如下系统的配置信息
- public float fontScale 设置字体的缩放因子
- public int keyboard 设置所关联的键盘类型:KEYBOARD_NOKEYS、KEYBOARD_QWERTY(普通电脑键盘)、KEYBOARD_12KEY(只有12个键的小键盘)
- public int keyboardHidden 只有硬件键盘和软键盘都不可用时才返回KEYBOARDHIDDEN_YES,否则返回KEYBOARDHIDDEN_NO
- 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
- (四)Handler消息传递机制
Handler类包含如下方法用于发送、处理消息
- void handleMessage(Message msg)
- final boolean hasMessages(int what)
- final boolean hasMessages(int what, Object object)
- Message obtainMessage()
- sendEmptyMessage(int what)
- final boolean sendEmptyMessageDelayed(int what, long delayMillis)
- final boolean sendMessage (Message msg)
- final boolean sendMessageDelayed(Message msg, long delayMillis)
使用实例:
final Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x1222) { doSomething(); } } }; //定义一个计时器,让该计时器周期性地执行指定任务 new Timer().schedule(new TimerTask() { @Override public void run() { //新启动的线程无法访问该Activity里的组件 //所以需要通过Handler发送信息 Message msg = new Message(); msg.what = 0x1222; //发送消息 myHandler.sendMessage(msg); } }, 0 , 2*1000);
- (五)使用手势
(先在AVD中用GestureBuilder创建手势,然后导出至/res/raw中)
library = GestureLibraries.fromRawResource(this, R.raw.gestures); if( !library.load() ){ finish(); } GestureOverlayView gesture = (GestureOverlayView)findViewById(R.id.gesture); gesture.addOnGesturePerformedListener(this); @Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { // TODO Auto-generated method stub ArrayList<Prediction> gestures = library.recognize(gesture); //获取全部预测结果 int index = 0; double score = 0.0; for(int i = 0; i < gestures.size(); ++i){ Prediction result = gestures.get(i); if(result.score > score){ index = i; score = result.score; } } Toast.makeText(this, gestures.get(index).name, Toast.LENGTH_LONG).show(); }
加Android进阶群 4112676,可免费或许Android进阶资料哦