麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

android 鍵盤事件和屏幕事件的運行原理及交互實現

2020-04-11 12:35:55
字體:
來源:轉載
供稿:網友
當在自定義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
package net.loonggg.project;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class MainActivity extends Activity {
private GameView gameView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameView = new GameView(this);
setContentView(gameView);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("MainActivity:" + " keyCode:" + keyCode + " evnet:"
+ event);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("MainActivity:" + " event:" + event + " x:"
+ event.getX() + " y:" + event.getY());
return super.onTouchEvent(event);
}
}
package net.loonggg.project;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View {
private Paint paint;
private int pointX;
private int pointY;
public GameView(Context context) {
super(context);
// 設置GameView獲得焦點
this.setFocusable(true);
paint = new Paint();
paint.setColor(Color.YELLOW);
Thread t = new Thread(new MyThread());
t.start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(pointX, pointY, 15, paint);
}
class MyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
pointY = pointY + 10;
pointX = pointX + 10;
if (pointX > 200) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
GameView.this.postInvalidate();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("GameView:" + " keyCode:" + keyCode + " evnet:"
+ event);
//此事件不會傳播出去
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("GameView:" + " event:" + event + " x:"
+ event.getX() + " y:" + event.getY());
//此事件不會傳播出去
return true;
}
}

第二種方法
復制代碼 代碼如下:

View Code
package net.loonggg.project;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class MainActivity extends Activity {
private GameView gameView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameView = new GameView(this);
setContentView(gameView);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("MainActivity:" + " keyCode:" + keyCode + " evnet:"
+ event);
//把事件傳遞給gameView
gameView.onKeyDown(keyCode, event);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("MainActivity:" + " event:" + event + " x:"
+ event.getX() + " y:" + event.getY());
//把事件傳遞給gameView
gameView.onTouchEvent(event);
return super.onTouchEvent(event);
}
}
package net.loonggg.project;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View {
private Paint paint;
private int pointX;
private int pointY;
public GameView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.YELLOW);
Thread t = new Thread(new MyThread());
t.start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(pointX, pointY, 15, paint);
}
class MyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
pointY = pointY + 10;
pointX = pointX + 10;
if (pointX > 200) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
GameView.this.postInvalidate();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("GameView:" + " keyCode:" + keyCode + " evnet:"
+ event);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("GameView:" + " event:" + event + " x:"
+ event.getX() + " y:" + event.getY());
return super.onTouchEvent(event);
}
}

在這里,推薦使用第二種方法,因為第一種方法有的模擬器不能夠使用!
主站蜘蛛池模板: 黄色一级视频 | 国产精品视频一区二区噜噜 | 视频一区 在线 | 青草久久久久 | 中文字幕在线播放第一页 | 一区二区三区欧洲 | 在线免费亚洲 | 成人毛片100部免费观看 | 7777视频| 亚洲成人在线视频网站 | 中国毛片在线观看 | 国产午夜精品久久久久 | 久久艹国产精品 | 一本色道久久综合亚洲精品图片 | 久草在线资源福利站 | 国产精品久久久久久影院8一贰佰 | 国产亚洲精品一区二区三区 | 午夜国产精品成人 | 国产一级性生活视频 | 一级大黄毛片 | 国产一国产精品一级毛片 | 亚洲欧洲av在线 | 久久国产在线观看 | 久久精品99北条麻妃 | 国产精品成人av片免费看最爱 | 视频一区二区国产 | 欧美视频网 | 色诱亚洲精品久久久久久 | www.三区 | 特级毛片全部免费播放器 | 中国免费一级毛片 | 青草久久久久 | 国产成人精品一区二区视频免费 | xxxx8 | 国产69精品久久久久久 | 一级毛片播放 | 精品国产一区二区三区免费 | 国产黄色一级大片 | 精品一区二区三区免费看 | 成人做爽爽爽爽免费国产软件 | 国产又白又嫩又紧又爽18p |