SoFunction
Updated on 2025-04-10

The operating principle and interactive implementation of android keyboard events and screen events

When customizing Views or making games, we often use keyboard trigger events and screen trigger events! How do keyboard trigger events in custom Views (for example: onKeyDown(int keyCode, KeyEvent event)) and screen trigger events (onTouchEvent(MotionEvent event)) and activity (for example: onKeyDown(int keyCode, KeyEvent event)) and screen trigger events (onTouchEvent(MotionEvent event)) interact? What is the operating principle? Let’s take a look below:

1. Screen trigger event: Which activity or view, the control is the first to trigger the screen trigger event in this control at the top level. If the return value is default or false, it will be passed down layer by layer! If the return value is true, it will not be passed down after the action is executed!
2. Keyboard trigger event: This principle is similar to the screen trigger event, but when the control is not set to be in focus, the keys in the keyboard usually trigger the keyboard trigger event in the activity (for example: onKeyDown(int keyCode, KeyEvent event)).

Let's give an example below
For example, when making games, we often customize the view. We generally like to use and use the keyboard trigger events and screen trigger events in this view (GameView), but for example: onKeyDown(int keyCode, KeyEvent event)), when we press the keyboard, we are directly touching the keyboard trigger events in the activity. How to make it directly touch the keyboard trigger events in the GameView?

The first method
Example 1:
Copy the codeThe code is as follows:

View Code
package ;
import ;
import ;
import ;
import ;
public class MainActivity extends Activity {
private GameView gameView;
@Override
public void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
gameView = new GameView(this);
setContentView(gameView);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
("MainActivity:" + " keyCode:" + keyCode + " evnet:"
+ event);
return (keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
("MainActivity:" + " event:" + event + " x:"
+ () + " y:" + ());
return (event);
}
}
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
public class GameView extends View {
private Paint paint;
private int pointX;
private int pointY;
public GameView(Context context) {
super(context);
// Set GameView to get focus
(true);
paint = new Paint();
();
Thread t = new Thread(new MyThread());
();
}
@Override
protected void onDraw(Canvas canvas) {
(canvas);
(pointX, pointY, 15, paint);
}
class MyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
(3000);
pointY = pointY + 10;
pointX = pointX + 10;
if (pointX > 200) {
break;
}
} catch (InterruptedException e) {
();
}
();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
("GameView:" + " keyCode:" + keyCode + " evnet:"
+ event);
//This event will not be spread
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
("GameView:" + " event:" + event + " x:"
+ () + " y:" + ());
//This event will not be spread
return true;
}
}

The second method
Copy the codeThe code is as follows:

View Code
package ;
import ;
import ;
import ;
import ;
public class MainActivity extends Activity {
private GameView gameView;
@Override
public void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
gameView = new GameView(this);
setContentView(gameView);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
("MainActivity:" + " keyCode:" + keyCode + " evnet:"
+ event);
//Pass the event to the gameView
(keyCode, event);
return (keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
("MainActivity:" + " event:" + event + " x:"
+ () + " y:" + ());
//Pass the event to the gameView
(event);
return (event);
}
}
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
public class GameView extends View {
private Paint paint;
private int pointX;
private int pointY;
public GameView(Context context) {
super(context);
paint = new Paint();
();
Thread t = new Thread(new MyThread());
();
}
@Override
protected void onDraw(Canvas canvas) {
(canvas);
(pointX, pointY, 15, paint);
}
class MyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
(3000);
pointY = pointY + 10;
pointX = pointX + 10;
if (pointX > 200) {
break;
}
} catch (InterruptedException e) {
();
}
();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
("GameView:" + " keyCode:" + keyCode + " evnet:"
+ event);
return (keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
("GameView:" + " event:" + event + " x:"
+ () + " y:" + ());
return (event);
}
}

Here, the second method is recommended, because some emulators of the first method cannot be used!
You don’t understand the world of rumor god, you don’t have the life of Brother Zhun, only everyone knows the world of programmers. Programmers, fight for their wonderful world, work hard! come on……