The operation principle and interaction realization of android keyboard event and screen event

  • 2020-05-09 19:13:52
  • OfStack

When customizing View or playing games, we often use keyboard triggered events and screen triggered events! How do the keyboard triggers (onKeyDown(int keyCode, KeyEvent event) and screen triggers (onTouchEvent(MotionEvent event) and screen triggers (onKeyDown(int keyCode, KeyEvent event) and screen triggers (onTouchEvent MotionEvent event) interact in the custom View? How does it work? Here's a look:

1, screen trigger event: which activity or view, the control in the top layer will be the first to trigger the screen trigger event in this control, if the return value is the default or false will be passed down layer by layer! If the return value is true, it will not be passed down after the action is performed!
2. Keyboard trigger event: this principle is similar to screen trigger event, but different from screen trigger event, when the control is not set in focus, pressing the key in the keyboard will trigger the keyboard trigger event in activity (e.g. onKeyDown(int keyCode, KeyEvent event)).

Here's an example:
In play, for example, we often custom views, we generally like and use trigger this view (GameView) keyboard trigger and screen trigger events, but such as: onKeyDown (int keyCode, KeyEvent event)), 1, is when we press the keyboard directly triggered the keyboard in the activity trigger event, how to make it directly trigger (GameView) keyboard triggering event?

Method 1:
Example 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); 
//  Set up the GameView Get focus  
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); 
// The incident will not go public  
return true; 
} 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
System.out.println("GameView:" + " event:" + event + " x:" 
+ event.getX() + " y:" + event.getY()); 
// The incident will not go public  
return true; 
} 
} 

Method 2:
 
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); 
// Pass the event to 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()); 
// Pass the event to 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); 
} 
} 

Here, it is recommended to use the second method, because some of the emulators of the first method cannot be used!
You don't understand the world of bugs. You don't understand the world of programming apes. Program apes, for their own wonderful world struggle, work hard! Come on...

Related articles: