Android事件处理模型之---基于回调机制

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值