---恢复内容开始---
android中基本都是依托于界面上的编程,而与界面编程相关密切的就是事件的处理。当用户在程序界面上执行各种操作时,应用程序必须为用户动作提供响应,这种响应的动作就需要通过事件处理来完成。
Android提供了两种方式的事件处理(事件处理机制):
1、基于回调的事件处理(主要用于处理一些具有通用性的事件,代码实现简洁,但对某些特定事件无法使用回调的,只能采用监听方式);
---主要做法是重写Android组件特定的回调方法,或者重写Activity的回调方法。Android为绝大部分的界面组件提供了事件响应的回调方法。开发人员只需重写实现即可。
2、基于监听器的事件处理;
2.1主要做法就是为Android界面组件绑定特定的监听器。例如onClick事件,onLongPress等;
2.2实现监听器的几种形式:
---内部类形式:将事件监听器类定义为当前类的内部类;
---外部类形式:将事件监听器类定义为外部类;
---Activity本身作为事件监听器类,让activity本身实现监听器接口,并实现事件处理方法;
---匿名内部类形式:使用匿名内部类创建事件监听器对象
飞机移动实例:
part1:
package com.example.planegame; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class PlaneView extends View { private float X; private float Y; private Bitmap plane; private Paint paint; @Override public float getX() { return X; } @Override public void setX(float x) { X = x; } @Override public float getY() { return Y; } @Override public void setY(float y) { Y = y; } public PlaneView(Context context) { super(context); plane = BitmapFactory.decodeResource(getResources(), R.drawable.plane); setFocusable(true);//必须设置此view可聚焦,否则无法获得相关事件 paint = new Paint(); } public int gtePlaneWidth() { return plane.getWidth(); } public PlaneView(Context context, AttributeSet attrs) { super(context, attrs); } public PlaneView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public PlaneView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(plane, X, Y, paint); } } part2:
package com.example.planegame; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Display; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; public class MainActivity extends AppCompatActivity { private int speed = 10;//定义飞机移动速度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); //去掉窗口标题 requestWindowFeature(Window.FEATURE_NO_TITLE); //全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); final PlaneView planeView = new PlaneView(this); setContentView(planeView); planeView.setBackgroundResource(android.R.color.background_dark); //获取窗口属性 WindowManager manager = getWindowManager(); Display display = manager.getDefaultDisplay(); final DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); //设置飞机初始位置 planeView.setX(metrics.widthPixels / 2); planeView.setY(metrics.heightPixels * 7 / 10); planeView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { float curX = planeView.getX(); float curY = planeView.getY(); switch (event.getKeyCode()) { case KeyEvent.KEYCODE_DPAD_LEFT: float leftx = curX - speed; if (leftx < 0) { leftx = 0; } planeView.setX(leftx); break; case KeyEvent.KEYCODE_DPAD_RIGHT: float rx = curX + speed; if (rx > metrics.widthPixels - planeView.gtePlaneWidth()) { rx = metrics.widthPixels - planeView.gtePlaneWidth(); } planeView.setX(rx); break; case KeyEvent.KEYCODE_S: planeView.setY(curY + speed); break; case KeyEvent.KEYCODE_W: planeView.setY(curY - speed); break; } //通知重绘 planeView.invalidate(); return true; } }); } } 下节讲下Handler消息传递机制,不喜勿喷:)~
---恢复内容结束---