Android中的事件机制

来源:互联网 发布:北京网络空间安全协会 编辑:程序博客网 时间:2024/05/17 08:13

一、概述

         android中的事件机制,其实既包括三方面:事件、事件源、事件处理。

       1、事件

          (1) 事件是怎么被传递的?   (2)事件是怎么被消费的?    (3)消费以后怎么持续关注后续事件的?    

       2、事件源

            界面的控件是事件的来源。

       3、事件处理

            事件处理在android里面有两种方式,第一种是基于监听的事件处理;另一种是基于回调的事件处理。

二、事件

      1、事件发生后,首先得到事件的是Activity,然后由外而内,传递给容器,最后传递给控件。

        2、而后是由内而外层层处理事件,首先是控件本身处理:先用监听器处理,在用回调方法处理;其次是外围容器:也是先监听器

             处理,在用回调方法处理;最后在用Activity中的回调方法处理

        3、如果监听器的回调方法里面或者控件本身的回调方法里面的返回值是false,上述2将得到完整的执行;如果返回值是true,那么

             就在此方法打断,事件不会在往外传递了。而事件的后续事件由谁来处理呢??现在不知道呢。

            比如:

package com.example.onkeydown;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  MyLinear linear = new MyLinear(this);
  MyButton btn = new MyButton(this);
  btn.setText("按钮");
  linear.addView(btn);
  linear.setOnTouchListener(new OnTouchListener() {

   @Override
   public boolean onTouch(View v, MotionEvent event) {
    System.out.println("MyLinear.Listener===onTouchEvent");
    return false;
   }
  });
  btn.setOnTouchListener(new OnTouchListener() {

   @Override
   public boolean onTouch(View v, MotionEvent event) {
    System.out.println("MyButton.Listener===onTouchEvent");
    return false;
   }
  });
  setContentView(linear, new FrameLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  System.out.println("Activity===onTouchEvent");
  return super.onTouchEvent(event);
 }

}

class MyButton extends Button {

 public MyButton(Context context) {
  super(context);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  System.out.println("Button===onTouchEvent");
  return true;
 }

}

class MyLinear extends LinearLayout {

 public MyLinear(Context context) {
  super(context);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  System.out.println("MyLinear===onTouchEvent");
  return false;
 }

}