安卓界面事件

本文介绍了一个安卓应用案例,该应用允许用户通过物理方向键移动屏幕上的米老鼠图像。文章详细讲解了如何处理安卓界面事件,特别是方向键事件,包括设置布局、获取屏幕尺寸、设置焦点以及监听物理按键。此外,还涵盖了HOME、BACK和MENU键的检测,以及使用吐司提示来增强用户体验。
摘要由CSDN通过智能技术生成


一、学习要点

  1. 安卓界面事件
  2. 安卓事件处理方式
  3. 常用物理键

二、案例演示

1、案例演示

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

2、装备图片素材

在这里插入图片描述

  • 拷贝到drawable目录中
    在这里插入图片描述

3、字符串资源文件

  • strings.xml
    在这里插入图片描述
<resources>
    <string name="app_name">通过按键移动图片</string>
</resources>

4、主布局资源文件

  • activity_main.xml
    在这里插入图片描述
  • 约束布局改成线性布局并设置相应属性
    在这里插入图片描述
  • 添加一个图像视图
    在这里插入图片描述
  • 预览效果
    在这里插入图片描述

5、主界面类

  • MainActivity
    在这里插入图片描述
  • 声明常量和变量
    在这里插入图片描述
  • 通过资源标识符获取控件实例
    在这里插入图片描述
  • 让线性根布局获得焦点
    在这里插入图片描述
  • 获取图像控件的布局参数
    在这里插入图片描述
  • 给线性根布局注册按键监听器
    在这里插入图片描述
package net.hxl.move_mickey_by_key;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    // 声明常量和变量
    protected int STEP = 10;//步长
    private ImageView ivMickey; //米老鼠图像控件
    private LinearLayout root; // 线性根布局
    private LinearLayout.LayoutParams layoutParams;//布局参数
    private int screenWidth;//手机屏幕宽度
    private int screenHeight;//手机屏幕高度

//    @RequiresApi(api = Build.VERSION_CODES.R)
    @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();

        // 给线性根布局注册按键监听器,实现监听器接口,编写事件处理方法
        root.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // 根据按键来修改米老鼠图像控件的布局参数 - 改变图像的位置
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_UP: // 19, 按上方向键
                        layoutParams.topMargin = layoutParams.topMargin - STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_DOWN: // 20, 按下方向键
                        layoutParams.topMargin = layoutParams.topMargin + STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_LEFT: // 21, 按左方向键
                        layoutParams.leftMargin = layoutParams.leftMargin - STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_RIGHT: // 22, 按右方向键
                        layoutParams.leftMargin = layoutParams.leftMargin + STEP;
                        break;
                }
                // 重新设置米老鼠图像控件的布局参数,改变其位置
                ivMickey.setLayoutParams(layoutParams);

                return false; // 事件要往后传播
            }
        });
    }
}
  • 启动程序,查看效果

在这里插入图片描述

6、常用物理键

1、HOME键

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

2、Back键

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

3、Menu键

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

7、吐司提示

在这里插入图片描述

  • 查看效果
    在这里插入图片描述
package net.hxl.move_mickey_by_key;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    // 声明常量和变量
    protected int STEP = 10;//步长
    private ImageView ivMickey; //米老鼠图像控件
    private LinearLayout root; // 线性根布局
    private LinearLayout.LayoutParams layoutParams;//布局参数
    private int screenWidth;//手机屏幕宽度
    private int screenHeight;//手机屏幕高度

    @RequiresApi(api = Build.VERSION_CODES.R)
    @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();
        // 获取跟布局的布局参数

        // 获取手机屏幕尺寸
        screenWidth = getWindowManager().getCurrentWindowMetrics().getBounds().width();
        screenHeight = getWindowManager().getCurrentWindowMetrics().getBounds().height();

        // 给线性根布局注册监听器,实现监听器接口,编写事件处理方法
        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() <= 1500 ){
                            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,按右方向键
                        if (ivMickey.getLeft() <= 800){
                            layoutParams.leftMargin = layoutParams.leftMargin + STEP;
                        }else {
                            Toast.makeText(MainActivity.this, "碰到右边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
                // 重新设置图像控件的布局参数,改变其位置
                ivMickey.setLayoutParams(layoutParams);

                return false;//事件要往后传播
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值