一、导读

  • 曾经手机有物理键,可以根据按键进行响应,这是本讲我们要学习的内容,当然,现在手机取消了物理键,采用完全的触摸屏,后面我们会讲到触屏事件与手势操作。

二、安卓常用事件

1、单击事件

  • 当用户触碰到某个组件或者方向键被按下时产生该事件,该事件的监听器是View.OnClickListener,事件处理方法是onClick()

2、焦点事件

  • 组件得到或者失去焦点时产生该事件,监听器是View.OnFocusChangeListener,事件处理方法是onFocusChange()

3、按键事件

  • 用户按下或者释放手机键盘上的某个按键时产生,监听器是View.OnKeyListener, 事件处理方法是onKey()

4、触碰事件

  • 手机上具有触屏功能时,触碰屏幕产生该事件,监听器是View.OnTouchListener,事件处理方法是onTouch()

三、安卓事件处理方式

1、安卓事件处理方式

  • 基于回调的事件处理方式,在Activity生命周期那部分已经涉及到了七个回调方法。 (onCreate - onDestroy, onStart - onStop, onResume - onPause, onRestart )

2、基于监听的事件处理机制

  1. 注册事件监听器
  2. 实现事件监听器接口
  3. 编写事件处理代码

四、通过按键移动米老鼠

1、创建安卓应用

  • 基于Empty Activity模板创建安卓应用 - MoveMickeyByKey
    在这里插入图片描述

2、准备图片素材

将背景图片与米老鼠图片,拷贝到drawable目录里(米老鼠图片背景要镂空)
在这里插入图片描述

3、字符串资源文件

  • 字符串资源文件 strings.xml
    在这里插入图片描述

4、主布局资源文件

  1. 将默认的约束布局改成线性布局,设置相关属性
  2. 添加一个图像视图,设置相关属性(scaleType - 缩放类型;src - 图像源)
    在这里插入图片描述

5、主界面类实现功能

  • 主界面类 - MainActivity
  • 步骤如下:
    1. 声明常量和变量
    2. 通过资源标识符获取控件实例
    3. 让线性根布局获得焦点
    4. 获取米老鼠图像控件的布局参数
    5. 给线性根布局注册按键监听器
      在这里插入图片描述
      代码如下:
 private ImageView ivMickey;      // 图像控件
    private LinearLayout root;      // 线性布局
    private LinearLayout.LayoutParams layoutParams;      //布局参数
    private static final String TAG= "move_mickey_by_touch";     // 标记


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取实例
        root = findViewById(R.id.root);
        ivMickey = findViewById(R.id.iv_mickey);

        // 让根布局获取焦点
        root.setFocusable(true);
        root.requestFocus();

        // 获取图片控件的布局参数
        layoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();

        // 给线性根布局注册触摸监听器,实现监听器接口,编写触摸事件代码
        root.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // 根据不同触摸动作执行不同操作
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:   // 触点按下
                        // 调试信息输出触点坐标
                        Log.d(TAG,"ACTION_DOWN(" + event.getX()+ "," + event.getY() + ")");
                        break;
                    case MotionEvent.ACTION_MOVE:    // 触点移动
                        // 调试信息输出触点坐标
                        Log.d(TAG,"ACTION_MOVE(" + event.getX()+ "," + event.getY() + ")");
                        break;
                    case MotionEvent.ACTION_UP:       // 触点放开
                        // 调试信息输出触点坐标
                        Log.d(TAG,"ACTION_UP(" + event.getX()+ "," + event.getY() + ")");
                        break;

                }

                // 根据变化的触点坐标来更新米老鼠图像控件的布局参数
                // layoutParams.leftMargin = (int) (event.getX() - ivMickey.getWidth() / 2);
                // layoutParams.topMargin = (int) (event.getY() - ivMickey.getHeight() /2);

                // 设置米老鼠控件的坐标
                ivMickey.setX(event.getX() - ivMickey.getWidth() / 2);
                ivMickey.setY(event.getY() - ivMickey.getHeight() / 2);


                // 重新设置米老鼠布局参数
                ivMickey.setLayoutParams(layoutParams);

                return true;  // 设置为true,三个事件:down  move  up才会依次执行
            }
        });

    }

6、启动应用,查看效果

  • 按上下左右方向键来测试

7、代码说明

  1. 如果根布局没有获得焦点,那么按键不会移动米老鼠
    在这里插入图片描述

  2. 要将图像的布局参数类型转换成线性布局的布局参数
    在这里插入图片描述

  3. 布局参数修改之后,一定要图像控件重新设置布局参数
    在这里插入图片描述

五、常用物理键

1、HOME键

  • keyCode == KeyEvent.KEYCODE_HOME(判断用户是否按下了HOME物理键)

2、Back键

  • keyCode == KeyEvent.KEYCODE_BACK(判断用户是否按下了BACK物理键)

3、Menu键

  • keyCode == KeyEvent.KEYCODE_MENU(判断用户是否按下了MENU物理键)
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐