目录

安卓常用事件介绍

具体例子:

安卓常用事件介绍

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 )

具体例子:

新建一个安卓应用,并导入一张背景图片和图像

android按键事件分发机制 安卓按键事件_android按键事件分发机制

 将默认的约束布局改成线性布局,设置相关属性

android按键事件分发机制 安卓按键事件_控件_02

具体代码:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/img01"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <ImageView
        android:id="@+id/iv_mickey"
        android:layout_width="100dp"
        android:layout_height="120dp"
        android:scaleType="fitXY"
        android:src="@drawable/mickey"
        />
</LinearLayout>


打开strings 改变应用标题

android按键事件分发机制 安卓按键事件_控件_03

 具体代码:


<resources>
    <string name="app_name">通过按键移动米老鼠</string>
</resources>


打开MainActivity实现主界面功能

android按键事件分发机制 安卓按键事件_android studio_04

 实现代码:

android按键事件分发机制 安卓按键事件_android按键事件分发机制_05

 具体代码:


package net.zyt.movemickeybykey;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Resources;
import android.graphics.Point;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    private final int STEP=10;//移动步长
    private ImageView ivMickey;//米老鼠图像控件
    private LinearLayout root;//线性根布局
    private  LinearLayout.LayoutParams layoutParams;//布局参数

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        //通过资源标识符获取控件实例
        ivMickey=findViewById(R.id.iv_mickey);
       root=findViewById(R.id.root) ;
       //线性根部局获得焦点
        root.setFocusable(true);
        root.requestFocus();
        //获取图像控件的布局参数
        layoutParams= (LinearLayout.LayoutParams) ivMickey.getLayoutParams();//(alt+enter)


        //给线性根布局注册监听器,实现监听接口,编写事件处理方法
        root.setOnKeyListener(new View.OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                //根据按键来修改米老鼠图形控件的布局参数-改变图像的位置
                switch (keyCode){
                    case KeyEvent.KEYCODE_DPAD_UP://19,按的上方向健
                        // 上边界碰撞检测
                        if (ivMickey.getTop() >= 10) {
                            //判断米老鼠控件是否碰到上边界
                            layoutParams.topMargin = layoutParams.topMargin - STEP;
                        } else {
                            Toast.makeText(MainActivity.this, "温馨提示:碰到上边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;

                    case KeyEvent.KEYCODE_DPAD_DOWN://20,按的下方向健
                        // 下边界碰撞检测
                        if (ivMickey.getTop() <=1660) {
                            layoutParams.topMargin = layoutParams.topMargin + STEP;
                        } else {
                            Toast.makeText(MainActivity.this, "温馨提示:碰到下边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case KeyEvent.KEYCODE_DPAD_LEFT://21,按的左方向健
                        // 左边界碰撞检测
                        if (ivMickey.getLeft() >=10) {
                            //判断米老鼠控件是否碰到左边界
                            layoutParams.leftMargin=layoutParams.leftMargin-STEP;
                        } else {
                            Toast.makeText(MainActivity.this, "碰到左边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case KeyEvent.KEYCODE_DPAD_RIGHT://22,按的右方向健
                        Log.d("Mickey","ivMickey.getLeft():"+ivMickey.getLeft());
                        // 右边界碰撞检测
                        if (ivMickey.getLeft() <=800) {
                            layoutParams.leftMargin=layoutParams.leftMargin+STEP;
                        } else {
                            Toast.makeText(MainActivity.this, "碰到右边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
                //重新设置米老鼠图像控件的布局参数,改变其位置
                ivMickey.setLayoutParams(layoutParams);
                return false;//事件要往后传播
            }
        });

    }
}


运行效果:

android按键事件分发机制 安卓按键事件_android studio_06