當(dāng)在自定義View或者做游戲的時(shí)候,我們常常會(huì)用到鍵盤(pán)觸發(fā)事件和屏幕觸發(fā)事件!在自定義的View里的鍵盤(pán)觸發(fā)事件(比如:onKeyDown(int keyCode, KeyEvent event))和屏幕觸發(fā)事件(onTouchEvent(MotionEvent event))和activity里的鍵盤(pán)觸發(fā)事件(比如:onKeyDown(int keyCode, KeyEvent event))和屏幕觸發(fā)事件(onTouchEvent(MotionEvent event))是怎么樣交互的呢?是怎樣的一個(gè)運(yùn)行原理呢?下面來(lái)看看:
1、屏幕觸發(fā)事件:哪個(gè)activity或者視圖,控件在最上層就最先觸發(fā)這個(gè)控件里的屏幕觸發(fā)事件,返回值如果是默認(rèn)或者false就會(huì)一層一層的往下傳遞!如果返回值是true,則在執(zhí)行完動(dòng)作之后不會(huì)往下傳遞!
2、鍵盤(pán)觸發(fā)事件:這個(gè)原理和屏幕觸發(fā)事件差不多,但是不同的時(shí),在沒(méi)有設(shè)置控件處于焦點(diǎn)時(shí),一般按鍵盤(pán)里的按鍵觸發(fā)的是activity里的鍵盤(pán)觸發(fā)事件(比如:onKeyDown(int keyCode, KeyEvent event))。
下面來(lái)舉個(gè)例子:
比如在做游戲的時(shí)候,我們經(jīng)常自定義視圖,我們一般都喜歡和使用觸發(fā)本視圖(GameView)里的鍵盤(pán)觸發(fā)事件和屏幕觸發(fā)事件,但是比如:onKeyDown(int keyCode, KeyEvent event)),一般我們按鍵盤(pán)的時(shí)候直接觸發(fā)的是activity里的鍵盤(pán)觸發(fā)事件,怎樣讓它直接觸發(fā)(GameView)里的鍵盤(pán)觸發(fā)事件呢?
第一種方法:
例子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);
// 設(shè)置GameView獲得焦點(diǎn)
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);
//此事件不會(huì)傳播出去
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("GameView:" + " event:" + event + " x:"
+ event.getX() + " y:" + event.getY());
//此事件不會(huì)傳播出去
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);
}
}
在這里,推薦使用第二種方法,因?yàn)榈谝环N方法有的模擬器不能夠使用!
主站蜘蛛池模板:
九龙城区|
民和|
来安县|
潍坊市|
商洛市|
汪清县|
图们市|
神池县|
曲靖市|
化德县|
凤台县|
利辛县|
信宜市|
那坡县|
桂平市|
织金县|
乐至县|
汨罗市|
建德市|
香河县|
英吉沙县|
南投市|
丹寨县|
鄂托克前旗|
济源市|
石渠县|
哈密市|
海晏县|
青岛市|
揭西县|
柞水县|
惠东县|
合肥市|
涞水县|
视频|
鄄城县|
伊金霍洛旗|
鸡泽县|
阳城县|
广德县|
台州市|