您的位置:首页 > 移动开发 > Android开发

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

2016-03-07 20:43 429 查看
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;

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: