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对象:
代码语言:javascript复制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)
使用实例:
代码语言:javascript复制 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中)
代码语言:javascript复制 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();
}