Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的相应事件。当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。
1. onKeyDown方法:public boolean onKeyDown (int keyCode, KeyEvent event)
a. 该方法是KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法。该方法用来捕捉手机键盘被按下的事件。
b. 参数:
1). keyCode:被按下的键值即键盘码。手机键盘中每个按钮都会有其单独的键盘码(*注:同一个按键在不同型号的手机中的按键码可能不同)。
2). event:按键事件的对象。其中包含触发事件的详细信息,如事件的状态、类型、发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。
3). 返回值:为boolean类型,当返回true是,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理;返回false时,反之。
2. onKeyUp方法:(与onKeyDown类同)
3. onTouchEvent方法:publid boolean onTouchEvent(MotionEvent event)
a. 应用程序通过该方法处理手机屏幕的触摸事件。
b. 参数:
1) event:为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,如触摸位置、触摸类型以及时间等。该对象在用户触摸手机屏幕时被创建。
2) 返回值:与键盘响应事件相同(同上)。
3) 动作值:
屏幕被按下:MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN.
屏幕被抬起: MotionEvent.getAction()的值为MotionEvent.ACTION_UP.
屏幕中拖动:MotionEvent.getAction()的值为MotionEvent.ACTION_MOVE.
c. 示例:
1) 效果图:(点击屏幕时,会在点击的位置绘制一个矩形,在屏幕滑动时,矩形会随之移动,当离开屏幕时,取消绘制)
2) 代码:
package com.example.administrator.basisstudy.view.activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import com.example.administrator.basisstudy.R; /** * @author YK */ public class EventProcessingActivity extends AppCompatActivity { /** * 自定义View * 注:自定义View不会自动刷新, * 所以每次改变数据模型时都需要调用postInvalidate()进行屏幕刷新操作 */ MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView = new MyView(this); setContentView(myView); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ //按下 case MotionEvent.ACTION_DOWN: //改变X坐标 myView.x = (int) event.getX(); //改变Y坐标 myView.y = (int) event.getY() - 52; //重绘 myView.postInvalidate(); break; case MotionEvent.ACTION_UP: //改变X坐标 myView.x = (int) event.getX(); //改变Y坐标 myView.y = (int) event.getY() - 52; //重绘 myView.postInvalidate(); break; case MotionEvent.ACTION_MOVE: //改变X坐标 myView.x = -100; //改变Y坐标 myView.y = -100; //重绘 myView.postInvalidate(); break; default: } return super.onTouchEvent(event); } class MyView extends View{ Paint mPaint; int x = 50; int y = 50; int w = 50; public MyView(Context context) { super(context); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.GRAY); canvas.drawRect(x,y,x+w,y+w,mPaint); super.onDraw(canvas); } } }
4.onTrackBallEvent方法:public boolean onTrackballEvent (MotionEvent event)
a. 该方法是手机中轨迹球的处理方法。
b. 参数与返回值与上面类同
c.轨迹球与手机键盘的区别:
某些型号的手机设计出的轨迹球会比只有手机键盘时更美观
轨迹球使用更为简单,例如在游戏中
使用轨迹球会比键盘更为细化,即滚动轨迹球是,后台的表示状态的数值会变得更精准、细微
5.onFocusChanged:protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
a. 此方法只能在View中重写。该方法是焦点改变的回调方法。
b. 参数:
1) gainFocus:表示触发该事件的View是否获得了焦点,获得时,gainFocus为true,反之为false
2) direction:表示焦点移动的方向,用数值表示
3) previouslyFocusedRect:表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域,即表示焦点是从哪里来的。如果不可用,则为null