android学习之基础一android事件处理机制

来源:互联网 发布:java图形界面时间控件 编辑:程序博客网 时间:2024/04/30 09:17

android提供了两种事件处理机制:基于回调的事件处理和基于监听器的事件处理。

1基于回调的事件处理

         主要方法就是重写Android组件特定的回调方法;或者重写Activity的回调方法。Android为绝大部分界面组件都提供了事件响应的回调方法,我们只需要重写它们即可。一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码会显得比较简洁。但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理。

2基于监听器的事件处理

        主要做法就是为Android界面组建绑定特定的事件监听器;另外还可以在界面布局文件中为UI组件的android:onClick属性指定事件监听方法,通过这种方式指定事件监听方法时,需要在Activity中定义该事件监听方法。

   2.1监听的处理模型()

        事件监听的处理模型中,主要涉及如下三类对象:Event Source(事件源)事件发生的场所,如按钮、窗口、菜单等;Event(事件)封装了界面组件上发生的特定事情;Event Listener(事件监听器)负责监听事件源发生的事件,并对各种事件做出相应的响应。

        Android的事件处理机制是一种委托式(Delegation)事件处理方式:事件源将整个事件处理委托给事件监听器;当事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。每个组件均可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或多个事件源。

       上代码:

<!--定义一个按钮,该按钮将作为事件源-->

<Button

         android:id="@+id/bn"

         android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="单击我" />


//为该按钮绑定事件监听

public class EventQs extends Activity

   @Override

   public void onCreate(Bundle saveInstanceState)

   {

      super.onCreate(saveInstanceState);

      setContentView(R.layout.main);

      //get the button

     Button bn = (Button) findViewById(R.id.bn);

    //add listener to the button

    bn.setOnClickListener(new MyClickListener());

   }

//定义一个单击事件的监听器

class MyClickListener implements View.OnClickListener

{

   @Overrid

 public void onClic(View v)

{

  EditText txt = (EditText) findViewById(R.id.txt);

  txt.setText("bn按钮被击中了!");

}

}

}

 


例2 键盘事件的监听 ---控制飞机移动

//define a view

public class PlaneView extends View

{

   public float currentX;

   public float currentY;

   Bitmap plane;

   public PlaneView(Contex contex)

   {

       super(context);

       //define plane photo

       plane = BitmapFactory.decodeResource(context.getResource(),R.drawable.plane);

       setFocusable(true);

    }

    @Override

    public void onDraw(Canvas canvas)

    {

       super.onDraw(canvas);

       //create draw pen

      Paint p = new Paint();

      //draw plane

      canvas.drawBitmap(plane,currentX,currentY,p); 

     }   

}

  //Activity code

   public class PlaneGame extends Activity

   {

     //define the speed of plane

     private int speed = 10;

     @Override

    public void onCreate(Bundle saveInstanceState)

    { 

        super.onCreat(saveInstanceState);

       //delete the window title

       requestWindowFeature(Window.FEATURE_NO_TITLE);

        //full screen

       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN) ;

       //create planeView

      final   PlaneView planeView=new PlaneView(this);

      setContentView(planeView);

      planeView.setBackgroundResource(R.drawable.back);

      // get the manager of window

      WindowManager windowManager = getWindowManager();

     Display display = windowManager.getDefaultDisply();

     DisplayMetrics metrics = new DisplayMetrics();

     //get the screen width and height

     display.getMetrics(metrics);

     //define the plane's 

     planeView.currentX = metrics.widthPixels/2;

     planeView.currentY = metrics.heightPixels -40;

   //add listener to key event

    planeView.setOnKeyListener(new OnKeyListener())

   {

        @Override

        public boolean onKey(View source,int keyCode, KeyEvent event)  

        {

            //获取由哪个键触发的事件

            switch(event.getKeyCode())

             {

              case KeyEvent.KEYCODE_S:

                       planeView.currentY+=speed;

                       break;

               case KeyEvent.KEYCODE_W:

                      planeView.currentY-=speed;

                      break;


             }

              //redraw module

               planeView.invalidate();

                return true;

         }

    }

    }

    }


   










0 0
原创粉丝点击