博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android事件处理概述
阅读量:5021 次
发布时间:2019-06-12

本文共 4790 字,大约阅读时间需要 15 分钟。

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

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

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

转载于:https://www.cnblogs.com/lao-gao/p/10822718.html

你可能感兴趣的文章
SQL 高效运行注意事项(二)
查看>>
2014025669《嵌入式系统程序设计》第三,四周学习总结
查看>>
sql 注入命令大全
查看>>
互联网程序设计c++
查看>>
js跟着鼠标移动的文字
查看>>
身份证正则表达式验证
查看>>
U3D面试题
查看>>
差点把这好地儿给荒废了
查看>>
你的袜子还是干的吗?
查看>>
自然语言处理资源
查看>>
Android 浏览器开发WebView setBlockNetworkImage本末
查看>>
jsp 行动标签
查看>>
linux下面的中断处理软件中断tasklet机制
查看>>
解决Shockwave flash在chrome浏览器上崩溃的问题
查看>>
素数推断算法(高效率)
查看>>
POJ 2001 Shortest Prefixes(字典树)
查看>>
【Silverlight】汉诺塔游戏,带AI
查看>>
BigDecimal的引入和概述
查看>>
Oracle database server architecture
查看>>
PhpStorm 4.0 & 5.0 部署本地Web应用
查看>>