zoukankan      html  css  js  c++  java
  • 关于键盘触发事件和屏幕触发事件的问题

    当在自定义View或者做游戏的时候,我们常常会用到键盘触发事件和屏幕触发事件!在自定义的View里的键盘触发事件(比如:onKeyDown(int keyCode, KeyEvent event))和屏幕触发事件(onTouchEvent(MotionEvent event))和activity里的键盘触发事件(比如:onKeyDown(int keyCode, KeyEvent event))和屏幕触发事件(onTouchEvent(MotionEvent event))是怎么样交互的呢?是怎样的一个运行原理呢?下面来看看:

    1、屏幕触发事件:哪个activity或者视图,控件在最上层就最先触发这个控件里的屏幕触发事件,返回值如果是默认或者false就会一层一层的往下传递!如果返回值是true,则在执行完动作之后不会往下传递!

    2、键盘触发事件:这个原理和屏幕触发事件差不多,但是不同的时,在没有设置控件处于焦点时,一般按键盘里的按键触发的是activity里的键盘触发事件(比如:onKeyDown(int keyCode, KeyEvent event))。

    下面来举个例子:

    比如在做游戏的时候,我们经常自定义视图,我们一般都喜欢和使用触发本视图(GameView)里的键盘触发事件和屏幕触发事件,但是比如:onKeyDown(int keyCode, KeyEvent event)),一般我们按键盘的时候直接触发的是activity里的键盘触发事件,怎样让它直接触发(GameView)里的键盘触发事件呢?

    第一种方法:

    例子1:

    View Code
      1 package net.loonggg.project;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.view.KeyEvent;
      6 import android.view.MotionEvent;
      7 
      8 public class MainActivity extends Activity {
      9     private GameView gameView;
     10 
     11     @Override
     12     public void onCreate(Bundle savedInstanceState) {
     13         super.onCreate(savedInstanceState);
     14         gameView = new GameView(this);
     15         setContentView(gameView);
     16     }
     17 
     18     @Override
     19     public boolean onKeyDown(int keyCode, KeyEvent event) {
     20         System.out.println("MainActivity:" + " keyCode:" + keyCode + " evnet:"
     21                 + event);
     22         return super.onKeyDown(keyCode, event);
     23     }
     24 
     25     @Override
     26     public boolean onTouchEvent(MotionEvent event) {
     27         System.out.println("MainActivity:" + "  event:" + event + " x:"
     28                 + event.getX() + " y:" + event.getY());
     29         return super.onTouchEvent(event);
     30     }
     31 }
     32 
     33 
     34 
     35 
     36 package net.loonggg.project;
     37 
     38 import android.content.Context;
     39 import android.graphics.Canvas;
     40 import android.graphics.Color;
     41 import android.graphics.Paint;
     42 import android.view.KeyEvent;
     43 import android.view.MotionEvent;
     44 import android.view.View;
     45 
     46 public class GameView extends View {
     47     private Paint paint;
     48     private int pointX;
     49     private int pointY;
     50 
     51     public GameView(Context context) {
     52         super(context);
     53         // 设置GameView获得焦点
     54         this.setFocusable(true);
     55         paint = new Paint();
     56         paint.setColor(Color.YELLOW);
     57         Thread t = new Thread(new MyThread());
     58         t.start();
     59     }
     60 
     61     @Override
     62     protected void onDraw(Canvas canvas) {
     63         super.onDraw(canvas);
     64         canvas.drawCircle(pointX, pointY, 15, paint);
     65     }
     66 
     67     class MyThread implements Runnable {
     68 
     69         @Override
     70         public void run() {
     71             while (true) {
     72                 try {
     73                     Thread.sleep(3000);
     74                     pointY = pointY + 10;
     75                     pointX = pointX + 10;
     76                     if (pointX > 200) {
     77                         break;
     78                     }
     79                 } catch (InterruptedException e) {
     80                     e.printStackTrace();
     81                 }
     82 
     83                 GameView.this.postInvalidate();
     84             }
     85         }
     86 
     87     }
     88 
     89     @Override
     90     public boolean onKeyDown(int keyCode, KeyEvent event) {
     91         System.out.println("GameView:" + " keyCode:" + keyCode + " evnet:"
     92                 + event);
     93         //此事件不会传播出去
     94         return true;
     95     }
     96 
     97     @Override
     98     public boolean onTouchEvent(MotionEvent event) {
     99         System.out.println("GameView:" + "  event:" + event + " x:"
    100                 + event.getX() + " y:" + event.getY());
    101         //此事件不会传播出去
    102         return true;
    103     }
    104 
    105 }

    第二种方法:

    View Code
      1 package net.loonggg.project;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.view.KeyEvent;
      6 import android.view.MotionEvent;
      7 
      8 public class MainActivity extends Activity {
      9     private GameView gameView;
     10 
     11     @Override
     12     public void onCreate(Bundle savedInstanceState) {
     13         super.onCreate(savedInstanceState);
     14         gameView = new GameView(this);
     15         setContentView(gameView);
     16     }
     17 
     18     @Override
     19     public boolean onKeyDown(int keyCode, KeyEvent event) {
     20         System.out.println("MainActivity:" + " keyCode:" + keyCode + " evnet:"
     21                 + event);
     22         //把事件传递给gameView
     23         gameView.onKeyDown(keyCode, event);
     24         return super.onKeyDown(keyCode, event);
     25     }
     26 
     27     @Override
     28     public boolean onTouchEvent(MotionEvent event) {
     29         System.out.println("MainActivity:" + "  event:" + event + " x:"
     30                 + event.getX() + " y:" + event.getY());
     31         //把事件传递给gameView
     32         gameView.onTouchEvent(event);
     33         return super.onTouchEvent(event);
     34     }
     35 }
     36 
     37 
     38 
     39 package net.loonggg.project;
     40 
     41 import android.content.Context;
     42 import android.graphics.Canvas;
     43 import android.graphics.Color;
     44 import android.graphics.Paint;
     45 import android.view.KeyEvent;
     46 import android.view.MotionEvent;
     47 import android.view.View;
     48 
     49 public class GameView extends View {
     50     private Paint paint;
     51     private int pointX;
     52     private int pointY;
     53 
     54     public GameView(Context context) {
     55         super(context);
     56         paint = new Paint();
     57         paint.setColor(Color.YELLOW);
     58         Thread t = new Thread(new MyThread());
     59         t.start();
     60     }
     61 
     62     @Override
     63     protected void onDraw(Canvas canvas) {
     64         super.onDraw(canvas);
     65         canvas.drawCircle(pointX, pointY, 15, paint);
     66     }
     67 
     68     class MyThread implements Runnable {
     69 
     70         @Override
     71         public void run() {
     72             while (true) {
     73                 try {
     74                     Thread.sleep(3000);
     75                     pointY = pointY + 10;
     76                     pointX = pointX + 10;
     77                     if (pointX > 200) {
     78                         break;
     79                     }
     80                 } catch (InterruptedException e) {
     81                     e.printStackTrace();
     82                 }
     83 
     84                 GameView.this.postInvalidate();
     85             }
     86         }
     87 
     88     }
     89 
     90     @Override
     91     public boolean onKeyDown(int keyCode, KeyEvent event) {
     92         System.out.println("GameView:" + " keyCode:" + keyCode + " evnet:"
     93                 + event);
     94         return super.onKeyDown(keyCode, event);
     95     }
     96 
     97     @Override
     98     public boolean onTouchEvent(MotionEvent event) {
     99         System.out.println("GameView:" + "  event:" + event + " x:"
    100                 + event.getX() + " y:" + event.getY());
    101         return super.onTouchEvent(event);
    102     }
    103 
    104 }

    在这里,推荐使用第二种方法,因为第一种方法有的模拟器不能够使用!

  • 相关阅读:
    WPF复杂形状按钮
    (WPF)360安全卫士界面设计
    WPF图标拾取器
    WPF透明窗体制作
    空间分析开源库GEOS
    GIS开源程序收集
    flask 链接 url_for()
    自定制404错误页码
    Flask 模板语言
    flask路由和视图和cookie
  • 原文地址:https://www.cnblogs.com/loonggg/p/2851882.html
Copyright © 2011-2022 走看看