android事件处理概述

Posted lao-gao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android事件处理概述相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

  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消息传递机制,不喜勿喷:)~

---恢复内容结束---

以上是关于android事件处理概述的主要内容,如果未能解决你的问题,请参考以下文章

Android零基础入门第33节:Android事件处理概述

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Reactreact概述组件事件

Android触摸事件-TouchEventHelper

android开发之多线程实现方法概述

Android导航组件ActionBar向上/父事件处理